FOLLOW-UP: Add intro section

Load frequently used packages

#library(dtplyr)
library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.14.2 using 6 threads (see ?getDTthreads).  Latest news: r-datatable.com
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.8
✓ tidyr   1.2.0     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
Warning: package ‘tidyr’ was built under R version 4.1.2
Warning: package ‘readr’ was built under R version 4.1.2
Warning: package ‘dplyr’ was built under R version 4.1.2
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::between()   masks data.table::between()
x dplyr::filter()    masks stats::filter()
x dplyr::first()     masks data.table::first()
x dplyr::lag()       masks stats::lag()
x dplyr::last()      masks data.table::last()
x purrr::transpose() masks data.table::transpose()
library(skimr)
library(openxlsx)
library(ggrepel)
library(dplyr)
library(tidyr)
library(data.table)
library(broom)
Warning: package ‘broom’ was built under R version 4.1.2
library(broomExtra)
Warning: package ‘broomExtra’ was built under R version 4.1.2
Registered S3 method overwritten by 'parameters':
  method                         from      
  format.parameters_distribution datawizard

Attaching package: ‘broomExtra’

The following objects are masked from ‘package:broom’:

    augment, glance, tidy
library(tibble)
library(sjstats)

Attaching package: ‘sjstats’

The following object is masked from ‘package:broom’:

    bootstrap
library(car)
Loading required package: carData
Warning: package ‘carData’ was built under R version 4.1.2

Attaching package: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

The following object is masked from ‘package:purrr’:

    some
#library(lme4)
#library(lmerTest)
library(ggplot2)
library(tibble)
library(modelr)

Attaching package: ‘modelr’

The following objects are masked from ‘package:sjstats’:

    bootstrap, mse, rmse

The following object is masked from ‘package:broom’:

    bootstrap
library(tidyverse)
#library(miceadds)
library(ggforce)
require(openxlsx)
library(tidyverse)
library(caret)
Warning: package ‘caret’ was built under R version 4.1.2
Loading required package: lattice

Attaching package: ‘caret’

The following object is masked from ‘package:purrr’:

    lift
#library(glmnet)
library(ggplot2)
library(gridExtra)

Attaching package: ‘gridExtra’

The following object is masked from ‘package:dplyr’:

    combine
library(MASS) # rlm
Warning: package ‘MASS’ was built under R version 4.1.2

Attaching package: ‘MASS’

The following object is masked from ‘package:dplyr’:

    select
library(lmPerm)

Attaching package: ‘lmPerm’

The following object is masked from ‘package:modelr’:

    permute
library(circlize)
Warning: package ‘circlize’ was built under R version 4.1.2
========================================
circlize version 0.4.14
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================
library(RColorBrewer)
Warning: package ‘RColorBrewer’ was built under R version 4.1.2
library(ComplexHeatmap)
Loading required package: grid
========================================
ComplexHeatmap version 2.8.0
Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
Github page: https://github.com/jokergoo/ComplexHeatmap
Documentation: http://jokergoo.github.io/ComplexHeatmap-reference

If you use it in published research, please cite:
Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
  genomic data. Bioinformatics 2016.

The new InteractiveComplexHeatmap package can directly export static 
complex heatmaps into an interactive Shiny app with zero effort. Have a try!

This message can be suppressed by:
  suppressPackageStartupMessages(library(ComplexHeatmap))
========================================
select <- dplyr::select
filter <- dplyr::filter
`%notin%` <- Negate(`%in%`)

Store In and Out directory locations to R objects

#setwd('/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN')
dir.ImputationResultsRAW <- "/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results/Results"
dir.ImputationResultsCLEAN <- "/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN"
dir.ImputationResults.QCstats <- "/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results/QC_Statistics"
dir.Data <- "/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data"
dir.Plots <- "/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Plots"
dir.GRSoriginal.Anno <- "/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal"
dir.GRSrevised.Anno <- "/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised"

Copy the imputed VCF and index file to the manuscript data directory

#cd '/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN'
#cp -a 'MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz' '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data/'

#cp -a 'MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz.csi' '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data/'

#cp -a 'autosomesNoChr21.info.gz' '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data/'

View the VCF header and the start of the VCF data section

cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data/'
zcat < 'MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz' | head -n 44
##fileformat=VCFv4.1
##FILTER=<ID=PASS,Description="All filters passed">
##filedate=2022.4.12
##contig=<ID=1>
##INFO=<ID=AF,Number=1,Type=Float,Description="Estimated Alternate Allele Frequency">
##INFO=<ID=MAF,Number=1,Type=Float,Description="Estimated Minor Allele Frequency">
##INFO=<ID=R2,Number=1,Type=Float,Description="Estimated Imputation Accuracy (R-square)">
##INFO=<ID=ER2,Number=1,Type=Float,Description="Empirical (Leave-One-Out) R-square (available only for genotyped variants)">
##INFO=<ID=IMPUTED,Number=0,Type=Flag,Description="Marker was imputed but NOT genotyped">
##INFO=<ID=TYPED,Number=0,Type=Flag,Description="Marker was genotyped AND imputed">
##INFO=<ID=TYPED_ONLY,Number=0,Type=Flag,Description="Marker was genotyped but NOT imputed">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=DS,Number=1,Type=Float,Description="Estimated Alternate Allele Dosage : [P(0/1)+2*P(1/1)]">
##FORMAT=<ID=HDS,Number=2,Type=Float,Description="Estimated Haploid Alternate Allele Dosage">
##FORMAT=<ID=GP,Number=3,Type=Float,Description="Estimated Posterior Probabilities for Genotypes 0/0, 0/1 and 1/1">
##pipeline=michigan-imputationserver-1.6.6
##imputation=minimac4-1.0.2
##phasing=eagle-2.4
##panel=apps@1000g-phase-3-v5
##r2Filter=0.0
##contig=<ID=2>
##contig=<ID=3>
##contig=<ID=4>
##contig=<ID=5>
##contig=<ID=6>
##contig=<ID=7>
##contig=<ID=8>
##contig=<ID=9>
##contig=<ID=10>
##contig=<ID=11>
##contig=<ID=12>
##contig=<ID=13>
##contig=<ID=14>
##contig=<ID=15>
##contig=<ID=16>
##contig=<ID=17>
##contig=<ID=18>
##contig=<ID=19>
##contig=<ID=20>
##contig=<ID=22>
##bcftools_concatVersion=1.14+htslib-1.14
##bcftools_concatCommand=concat -Oz -o /Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz chr1.dose.vcf.gz chr2.dose.vcf.gz chr3.dose.vcf.gz chr4.dose.vcf.gz chr5.dose.vcf.gz chr6.dose.vcf.gz chr7.dose.vcf.gz chr8.dose.vcf.gz chr9.dose.vcf.gz chr10.dose.vcf.gz chr11.dose.vcf.gz chr12.dose.vcf.gz chr13.dose.vcf.gz chr14.dose.vcf.gz chr15.dose.vcf.gz chr16.dose.vcf.gz chr17.dose.vcf.gz chr18.dose.vcf.gz chr19.dose.vcf.gz chr20.dose.vcf.gz chr22.dose.vcf.gz; Date=Wed Apr 13 15:23:47 2022
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  1_WG1-DNA_A01_NA19235   2_WG1-DNA_B01_HTP0207A  3_WG1-DNA_C01_HTP0207A  4_WG1-DNA_D01_HTP0222A  5_WG1-DNA_E01_HTP0442A  6_WG1-DNA_F01_HTP0219A  7_WG1-DNA_G01_HTP0465A  8_WG1-DNA_H01_HTP0119A  9_WG1-DNA_B02_HTP0223A  10_WG1-DNA_C02_HTP0471A 11_WG1-DNA_D02_HTP0213A 12_WG1-DNA_E02_HTP0220A 13_WG1-DNA_F02_HTP0224A 14_WG1-DNA_G02_HTP0123A 15_WG1-DNA_H02_HTP0151A 16_WG1-DNA_A03_HTP0215A 17_WG1-DNA_B03_HTP0265A 18_WG1-DNA_C03_HTP0129A 19_WG1-DNA_D03_HTP0198A 20_WG1-DNA_E03_HTP0221A 21_WG1-DNA_F03_HTP0204A 22_WG1-DNA_G03_HTP0217A 23_WG1-DNA_H03_HTP0415A 24_WG1-DNA_A04_HTP0139A 25_WG1-DNA_B04_HTP0218A 26_WG1-DNA_C04_HTP0254A 27_WG1-DNA_D04_HTP0232A 28_WG1-DNA_E04_HTP0238A 29_WG1-DNA_F04_HTP0241A 30_WG1-DNA_G04_HTP0249A 31_WG1-DNA_H04_HTP0258A 32_WG1-DNA_A05_HTP0261A 33_WG1-DNA_B05_HTP0266A 34_WG1-DNA_C05_HTP0226A 35_WG1-DNA_D05_HTP0250A 36_WG1-DNA_E05_HTP0227A 37_WG1-DNA_F05_HTP0233A 38_WG1-DNA_G05_HTP0243A 39_WG1-DNA_H05_HTP0262A 40_WG1-DNA_A06_NA19236  41_WG1-DNA_B06_HTP0267A 42_WG1-DNA_C06_HTP0267A 43_WG1-DNA_D06_HTP0228A 44_WG1-DNA_E06_HTP0251A 45_WG1-DNA_F06_HTP0256A 46_WG1-DNA_G06_HTP0259A 47_WG1-DNA_H06_HTP0234A 48_WG1-DNA_A07_HTP0263A 49_WG1-DNA_B07_HTP0268A 50_WG1-DNA_C07_HTP0229A 51_WG1-DNA_D07_HTP0239A 52_WG1-DNA_E07_HTP0245A 53_WG1-DNA_F07_HTP0253A 54_WG1-DNA_G07_HTP0235A 55_WG1-DNA_H07_HTP0257A 56_WG1-DNA_A08_HTP0260A 57_WG1-DNA_B08_HTP0230A 58_WG1-DNA_C08_HTP0236A 59_WG1-DNA_D08_HTP0240A 60_WG1-DNA_E08_HTP0247A 61_WG1-DNA_F08_HTP0264A 62_WG1-DNA_G08_HTP0269A 63_WG1-DNA_H08_HTP0306A 64_WG1-DNA_A09_HTP0318A 65_WG1-DNA_B09_HTP0084A2    66_WG1-DNA_C09_HTP0270A 67_WG1-DNA_D09_HTP0275A 68_WG1-DNA_E09_HTP0293A 69_WG1-DNA_F09_HTP0300A 70_WG1-DNA_G09_HTP0328A 71_WG1-DNA_H09_HTP0337A 72_WG1-DNA_A10_HTP0310A 73_WG1-DNA_B10_HTP0319A 74_WG1-DNA_C10_HTP0345A 75_WG1-DNA_D10_HTP0272A 76_WG1-DNA_E10_HTP0276A 77_WG1-DNA_F10_HTP0295A 78_WG1-DNA_G10_HTP0301A 79_WG1-DNA_H10_HTP0331A 80_WG1-DNA_A11_HTP0012A2    81_WG1-DNA_B11_HTP0320A 82_WG1-DNA_C11_HTP0303A 83_WG1-DNA_D11_HTP0315A 84_WG1-DNA_E11_HTP0332A 85_WG1-DNA_F11_HTP0273A 86_WG1-DNA_G11_HTP0277A 87_WG1-DNA_H11_HTP0296A 88_WG1-DNA_A12_NA19237  89_WG1-DNA_B12_HTP0334A 90_WG1-DNA_C12_HTP0023A2    91_WG1-DNA_D12_HTP0274A 92_WG1-DNA_E12_HTP0326A 93_WG1-DNA_F12_HTP0335A 94_WG1-DNA_G12_HTP0348A 95_WG1-DNA_H12_HTP0080A2    96_WG2-DNA_B01_HTP0036A2    97_WG2-DNA_C01_HTP0036A2    98_WG2-DNA_D01_HTP0394A 99_WG2-DNA_E01_HTP0350A 100_WG2-DNA_F01_HTP0382A    101_WG2-DNA_G01_HTP0391A    102_WG2-DNA_H01_HTP0398A    103_WG2-DNA_C02_HTP0378A    104_WG2-DNA_D02_HTP0387A    105_WG2-DNA_E02_HTP0395A    106_WG2-DNA_F02_HTP0351A    107_WG2-DNA_G02_HTP0388A    108_WG2-DNA_C03_HTP0384A    109_WG2-DNA_D03_HTP0389A    110_WG2-DNA_E03_HTP0392A    111_WG2-DNA_F03_HTP0052A2   112_WG2-DNA_G03_HTP0373A    113_WG2-DNA_H03_HTP0396A    114_WG2-DNA_B04_HTP0050A2   115_WG2-DNA_C04_HTP0380A    116_WG2-DNA_D04_HTP0385A    117_WG2-DNA_E04_HTP0053A2   118_WG2-DNA_F04_HTP0374A    119_WG2-DNA_G04_HTP0381A    120_WG2-DNA_A05_HTP0393A    121_WG2-DNA_C05_HTP0375A    122_WG2-DNA_D05_HTP0386A    123_WG2-DNA_E05_HTP0397A    124_WG2-DNA_F05_HTP0406A    125_WG2-DNA_G05_HTP0412A    126_WG2-DNA_H05_HTP0422A    127_WG2-DNA_D06_HTP0402A    128_WG2-DNA_E06_HTP0426A    129_WG2-DNA_F06_HTP0435A    130_WG2-DNA_G06_HTP0403A    131_WG2-DNA_H06_HTP0413A    132_WG2-DNA_A07_HTP0419A    133_WG2-DNA_B07_HTP0423A    134_WG2-DNA_C07_HTP0407A    135_WG2-DNA_D07_HTP0410A    136_WG2-DNA_E07_HTP0433A    137_WG2-DNA_F07_HTP0404A    138_WG2-DNA_G07_HTP0408A    139_WG2-DNA_H07_HTP0428A    140_WG2-DNA_A08_HTP0436A    141_WG2-DNA_B08_HTP0414A    142_WG2-DNA_C08_HTP0420A    143_WG2-DNA_D08_HTP0424A    144_WG2-DNA_E08_HTP0411A    145_WG2-DNA_F08_HTP0430A    146_WG2-DNA_G08_HTP0437A    147_WG2-DNA_H08_HTP0405A    148_WG2-DNA_A09_HTP0409A    149_WG2-DNA_B09_HTP0416A    150_WG2-DNA_C09_HTP0421A    151_WG2-DNA_D09_HTP0425A    152_WG2-DNA_E09_HTP0434A    153_WG2-DNA_F09_HTP0418A    154_WG2-DNA_G09_HTP0443A    155_WG2-DNA_H09_HTP0450A    156_WG2-DNA_D10_HTP0469A    157_WG2-DNA_E10_HTP0456A    158_WG2-DNA_F10_HTP0475A    159_WG2-DNA_G10_HTP0480A    160_WG2-DNA_H10_HTP0438A    161_WG2-DNA_A11_HTP0445A    162_WG2-DNA_B11_HTP0451A    163_WG2-DNA_C11_HTP0461A    164_WG2-DNA_D11_HTP0467A    165_WG2-DNA_E11_HTP0476A    166_WG2-DNA_F11_HTP0439A    167_WG2-DNA_G11_HTP0448A    168_WG2-DNA_H11_HTP0458A    169_WG2-DNA_B12_HTP0482A    170_WG2-DNA_C12_HTP0452A    171_WG2-DNA_D12_HTP0462A    172_WG2-DNA_E12_HTP0478A    173_WG2-DNA_F12_HTP0459A    174_WG2-DNA_G12_HTP0468A    175_WG2-DNA_H12_HTP0484A    176_WG3-DNA_A01_NA19235 177_WG3-DNA_B01_HTP0440A    178_WG3-DNA_C01_HTP0440A    179_WG3-DNA_D01_HTP0449A    180_WG3-DNA_E01_HTP0463A    181_WG3-DNA_F01_HTP0479A    182_WG3-DNA_G01_HTP0453A    183_WG3-DNA_H01_HTP0515A    184_WG3-DNA_C02_HTP0519A    185_WG3-DNA_D02_HTP0005A3   186_WG3-DNA_E02_HTP0516A    187_WG3-DNA_F02_HTP0517A    188_WG3-DNA_G02_HTP0329A2   189_WG3-DNA_H02_HTP0015A3   190_WG3-DNA_C03_HTP0333A3   191_WG3-DNA_D03_HTP0112A2   192_WG3-DNA_E03_HTP0512A    193_WG3-DNA_F03_HTP0324A2   194_WG3-DNA_G03_HTP0340A2   195_WG3-DNA_H03_HTP0510A    198_WG3-DNA_F04_HTP0336A    199_WG3-DNA_G04_HTP0203A    200_WG3-DNA_H04_HTP0278A    201_WG3-DNA_A05_HTP0483A    202_WG3-DNA_B05_HTP0498B    203_WG3-DNA_C05_HTP0432A    204_WG3-DNA_D05_HTP0369A    205_WG3-DNA_E05_HTP0561A    206_WG3-DNA_F05_HTP0566A    207_WG3-DNA_G05_HTP0496B    208_WG3-DNA_H05_HTP0497B    209_WG4-DNA_D06_NA19235 210_WG4-DNA_E06_NA19237 211_WG5-DNA_F06_NA19174 212_WG5-DNA_G06_NA19117 214_WG6-DNA_B01_HTP0073A2   215_WG6-DNA_C01_HTP0054A2   216_WG6-DNA_D01_HTP0400A    217_WG6-DNA_E01_HTP0454A    218_WG6-DNA_F01_HTP0298A2   221_WG6-DNA_A02_HTP0431A    222_WG6-DNA_B02_HTP0460A    223_WG6-DNA_C02_HTP0464A    224_WG6-DNA_D02_HTP0399A    225_WG6-DNA_E02_HTP0390A    226_WG6-DNA_F02_HTP0017A4   227_WG6-DNA_G02_HTP0025A3   228_WG6-DNA_H02_HTP0514A    230_WG6-DNA_B03_HTP0066A2   231_WG6-DNA_C03_HTP0518A    232_WG6-DNA_D03_HTP0525A    233_WG6-DNA_E03_HTP0624A    234_WG6-DNA_F03_HTP0103A2   235_WG7-DNA_G03_NA19235 236_WG7-DNA_H03_NA19236 238_WG8-DNA_B04_NA18867 239_WG8-DNA_C04_NA18868 240_WG8-DNA_D04_NA18869 241_WG6-DNA_E04_NA19189 242_WG6-DNA_F04_NA19190 243_WG6-DNA_G04_NA19191 244_WG6-DNA_H04_HTP0431A
1   10177   1:10177:A:AC    A   AC  .   PASS    AF=0.35936;MAF=0.35936;R2=0.08647;IMPUTED   GT:DS:HDS:GP    1|0:0.975:0.524,0.452:0.261,0.502,0.237 0|0:0.765:0.318,0.447:0.377,0.481,0.142 0|0:0.765:0.447,0.318:0.377,0.481,0.142 1|0:0.941:0.529,0.412:0.277,0.505,0.218 0|0:0.749:0.267,0.482:0.380,0.492,0.129 0|0:0.903:0.421,0.482:0.300,0.497,0.203 0|1:1.164:0.416,0.747:0.147,0.541,0.311 0|0:0.506:0.395,0.112:0.538,0.418,0.044 1|0:1.079:0.632,0.448:0.203,0.514,0.283 0|0:0.518:0.341,0.177:0.543,0.397,0.060 0|0:0.857:0.463,0.394:0.325,0.492,0.182 0|0:0.639:0.265,0.373:0.460,0.441,0.099 1|0:1.190:0.719,0.470:0.149,0.513,0.338 0|0:0.547:0.270,0.276:0.528,0.397,0.075 0|0:0.709:0.378,0.330:0.416,0.459,0.125 0|0:0.643:0.231,0.412:0.452,0.452,0.095 0|0:0.631:0.294,0.337:0.468,0.433,0.099 0|0:0.516:0.209,0.307:0.548,0.387,0.064 0|0:0.687:0.357,0.330:0.431,0.451,0.118 0|0:0.772:0.369,0.403:0.377,0.475,0.149 0|1:0.821:0.227,0.594:0.314,0.551,0.135 0|0:0.637:0.231,0.406:0.457,0.449,0.094 0|0:0.603:0.351,0.252:0.486,0.426,0.088 0|0:0.455:0.160,0.295:0.592,0.361,0.047 0|0:0.592:0.191,0.401:0.485,0.439,0.077 0|0:0.821:0.425,0.396:0.347,0.484,0.168 0|0:0.406:0.254,0.151:0.633,0.329,0.038 0|0:0.686:0.422,0.263:0.425,0.463,0.111 0|0:0.718:0.390,0.329:0.410,0.462,0.128 0|0:0.393:0.194,0.199:0.646,0.316,0.039 0|0:0.559:0.391,0.168:0.507,0.427,0.066 0|0:0.825:0.419,0.406:0.345,0.485,0.170 0|0:0.521:0.133,0.389:0.530,0.418,0.052 0|0:0.515:0.311,0.204:0.549,0.388,0.063 0|0:0.585:0.227,0.358:0.497,0.422,0.081 0|0:0.741:0.408,0.333:0.395,0.469,0.136 1|0:1.023:0.638,0.385:0.223,0.532,0.246 0|0:0.581:0.174,0.407:0.490,0.439,0.071 0|0:0.534:0.139,0.395:0.521,0.424,0.055 1|0:0.840:0.727,0.114:0.242,0.675,0.082 0|0:0.625:0.336,0.289:0.472,0.431,0.097 0|0:0.625:0.289,0.336:0.472,0.431,0.097 1|0:1.033:0.554,0.479:0.232,0.502,0.265 0|0:0.665:0.444,0.221:0.433,0.469,0.098 0|0:0.765:0.418,0.347:0.380,0.475,0.145 0|0:0.628:0.324,0.304:0.471,0.431,0.098 0|0:0.877:0.462,0.415:0.315,0.493,0.192 0|0:0.755:0.414,0.341:0.386,0.473,0.141 0|1:0.882:0.230,0.652:0.268,0.582,0.150 0|0:0.723:0.301,0.422:0.404,0.469,0.127 0|0:0.819:0.414,0.405:0.349,0.484,0.168 1|0:0.698:0.519,0.179:0.395,0.512,0.093 0|0:0.642:0.302,0.339:0.461,0.436,0.103 0|0:0.458:0.127,0.331:0.584,0.374,0.042 0|0:0.506:0.295,0.211:0.556,0.382,0.062 0|0:0.408:0.172,0.235:0.633,0.327,0.041 0|0:0.719:0.302,0.417:0.407,0.467,0.126 0|1:0.910:0.397,0.514:0.293,0.503,0.204 0|0:0.639:0.231,0.409:0.455,0.451,0.094 0|0:0.661:0.249,0.411:0.442,0.456,0.103 0|0:0.612:0.317,0.296:0.481,0.425,0.094 0|0:0.270:0.099,0.171:0.747,0.236,0.017 1|0:0.960:0.630,0.329:0.248,0.544,0.208 0|0:0.748:0.389,0.359:0.392,0.469,0.140 0|0:0.860:0.485,0.375:0.322,0.496,0.182 0|0:0.771:0.405,0.367:0.377,0.475,0.148 0|0:0.538:0.273,0.265:0.535,0.393,0.072 1|0:1.040:0.723,0.317:0.189,0.582,0.229 1|0:0.851:0.501,0.351:0.324,0.500,0.175 0|0:0.588:0.164,0.424:0.482,0.449,0.070 0|0:0.777:0.406,0.372:0.373,0.476,0.151 0|0:0.460:0.162,0.298:0.589,0.363,0.048 0|0:0.655:0.404,0.251:0.446,0.452,0.102 0|0:0.560:0.353,0.207:0.513,0.414,0.073 0|0:0.586:0.335,0.251:0.498,0.418,0.084 0|0:0.879:0.477,0.402:0.312,0.496,0.192 0|0:0.669:0.432,0.236:0.433,0.464,0.102 0|1:0.958:0.254,0.705:0.220,0.601,0.179 0|0:0.664:0.393,0.271:0.442,0.451,0.107 0|0:0.938:0.462,0.476:0.282,0.498,0.220 0|0:0.849:0.493,0.356:0.326,0.498,0.176 0|0:0.435:0.163,0.272:0.610,0.346,0.044 0|0:0.541:0.275,0.266:0.532,0.394,0.073 0|0:0.718:0.404,0.314:0.409,0.464,0.127 0|0:0.699:0.374,0.325:0.423,0.456,0.122 0|0:0.676:0.423,0.254:0.431,0.462,0.107 0|0:0.669:0.432,0.236:0.433,0.464,0.102 1|1:1.535:0.719,0.816:0.052,0.362,0.586 0|0:0.649:0.359,0.291:0.455,0.441,0.104 1|0:0.780:0.616,0.164:0.321,0.578,0.101 0|0:0.474:0.258,0.216:0.582,0.362,0.056 0|0:0.693:0.395,0.298:0.425,0.458,0.118 0|0:0.570:0.253,0.317:0.510,0.409,0.080 0|0:0.617:0.301,0.316:0.478,0.427,0.095 0|0:0.657:0.327,0.330:0.451,0.441,0.108 0|0:0.741:0.361,0.380:0.396,0.467,0.137 0|0:0.741:0.361,0.380:0.396,0.467,0.137 0|0:0.584:0.189,0.395:0.491,0.435,0.075 0|0:0.647:0.309,0.338:0.458,0.438,0.104 0|0:0.699:0.379,0.319:0.422,0.456,0.121 1|1:1.237:0.704,0.533:0.138,0.487,0.375 0|0:0.638:0.252,0.386:0.459,0.444,0.097 0|0:0.527:0.379,0.148:0.529,0.415,0.056 1|0:0.704:0.521,0.184:0.391,0.513,0.096 0|0:0.852:0.423,0.429:0.329,0.489,0.181 0|0:0.622:0.213,0.409:0.465,0.448,0.087 0|0:0.484:0.321,0.164:0.568,0.379,0.052 0|0:0.560:0.361,0.199:0.512,0.417,0.072 0|0:0.614:0.313,0.300:0.480,0.426,0.094 0|0:0.572:0.156,0.416:0.493,0.442,0.065 0|0:0.627:0.300,0.327:0.471,0.431,0.098 0|0:0.755:0.434,0.320:0.384,0.476,0.139 0|1:1.123:0.485,0.637:0.187,0.504,0.309 0|0:0.705:0.354,0.351:0.419,0.456,0.124 1|0:0.936:0.540,0.396:0.278,0.508,0.214 1|0:0.835:0.509,0.326:0.331,0.503,0.166 0|0:0.721:0.414,0.306:0.406,0.467,0.127 0|0:0.799:0.434,0.364:0.360,0.482,0.158 0|1:0.984:0.327,0.658:0.230,0.555,0.215 0|0:0.708:0.297,0.410:0.414,0.464,0.122 0|0:0.472:0.171,0.301:0.580,0.369,0.051 0|0:0.604:0.302,0.303:0.487,0.422,0.091 0|0:0.640:0.215,0.425:0.451,0.457,0.091 0|1:0.853:0.209,0.643:0.282,0.583,0.135 0|0:0.410:0.291,0.119:0.624,0.341,0.035 0|0:0.608:0.434,0.174:0.468,0.457,0.075 0|0:0.897:0.445,0.452:0.304,0.495,0.201 0|0:0.354:0.192,0.163:0.677,0.292,0.031 0|0:0.787:0.443,0.344:0.366,0.482,0.152 0|0:0.617:0.220,0.397:0.470,0.443,0.087 1|0:0.978:0.545,0.433:0.258,0.506,0.236 0|0:0.721:0.313,0.408:0.407,0.465,0.128 1|0:0.931:0.581,0.349:0.272,0.525,0.203 0|0:0.616:0.397,0.219:0.471,0.442,0.087 0|0:0.596:0.254,0.342:0.491,0.422,0.087 0|0:0.661:0.423,0.238:0.440,0.460,0.101 0|0:0.778:0.322,0.456:0.369,0.484,0.147 1|0:0.929:0.639,0.289:0.256,0.559,0.185 0|0:0.717:0.413,0.304:0.409,0.466,0.126 0|0:0.424:0.163,0.262:0.618,0.339,0.043 0|0:0.782:0.421,0.361:0.370,0.478,0.152 0|0:0.593:0.206,0.387:0.486,0.434,0.080 0|0:0.819:0.365,0.454:0.347,0.487,0.166 0|0:0.770:0.462,0.308:0.372,0.485,0.143 0|0:0.847:0.402,0.445:0.332,0.489,0.179 0|1:1.141:0.500,0.641:0.179,0.500,0.320 0|0:0.539:0.319,0.219:0.531,0.399,0.070 0|0:0.530:0.335,0.195:0.536,0.399,0.065 0|1:1.207:0.488,0.719:0.144,0.505,0.351 0|0:0.616:0.346,0.269:0.478,0.429,0.093 0|0:0.619:0.215,0.403:0.468,0.445,0.087 0|0:0.869:0.404,0.465:0.319,0.493,0.188 0|0:0.693:0.350,0.342:0.427,0.453,0.120 0|0:0.702:0.341,0.361:0.421,0.456,0.123 0|0:0.634:0.181,0.453:0.448,0.470,0.082 0|0:0.876:0.377,0.499:0.312,0.500,0.188 0|0:0.664:0.317,0.347:0.446,0.444,0.110 0|0:0.717:0.418,0.299:0.408,0.467,0.125 0|0:0.761:0.458,0.303:0.378,0.484,0.139 0|0:0.606:0.400,0.206:0.477,0.441,0.082 0|0:0.756:0.348,0.408:0.386,0.472,0.142 0|0:0.656:0.363,0.293:0.450,0.443,0.106 0|0:0.411:0.328,0.083:0.616,0.357,0.027 0|0:0.689:0.305,0.384:0.428,0.455,0.117 0|0:0.515:0.354,0.161:0.542,0.401,0.057 0|0:0.335:0.191,0.145:0.692,0.280,0.028 0|0:0.637:0.315,0.322:0.464,0.434,0.102 0|0:0.606:0.315,0.291:0.486,0.423,0.092 0|0:0.654:0.375,0.279:0.451,0.445,0.105 0|0:0.635:0.329,0.307:0.466,0.434,0.101 0|0:0.652:0.318,0.334:0.455,0.439,0.106 0|0:0.840:0.482,0.358:0.333,0.495,0.172 0|0:0.708:0.339,0.369:0.417,0.458,0.125 0|0:0.557:0.189,0.368:0.513,0.418,0.070 0|0:0.697:0.397,0.300:0.422,0.459,0.119 1|0:1.245:0.816,0.429:0.105,0.545,0.350 0|1:0.922:0.235,0.686:0.240,0.599,0.162 1|0:0.883:0.648,0.235:0.270,0.578,0.152 1|0:0.932:0.540,0.392:0.280,0.509,0.212 0|0:0.720:0.341,0.379:0.409,0.462,0.129 0|0:0.336:0.176,0.160:0.692,0.280,0.028 1|1:1.326:0.686,0.641:0.113,0.448,0.439 1|1:1.354:0.634,0.720:0.102,0.441,0.457 0|0:0.557:0.245,0.313:0.519,0.404,0.077 1|0:1.031:0.637,0.394:0.220,0.529,0.251 0|0:0.830:0.354,0.476:0.338,0.493,0.168 0|0:0.467:0.262,0.205:0.587,0.360,0.054 0|0:0.410:0.113,0.297:0.623,0.343,0.034 0|0:0.500:0.237,0.262:0.562,0.375,0.062 0|1:0.967:0.327,0.640:0.242,0.548,0.209 0|0:0.584:0.194,0.390:0.492,0.433,0.076 0|0:0.543:0.392,0.151:0.516,0.425,0.059 0|0:0.735:0.351,0.385:0.400,0.466,0.135 0|0:0.356:0.192,0.165:0.675,0.293,0.032 1|0:0.768:0.546,0.222:0.353,0.526,0.121 0|0:0.619:0.290,0.329:0.477,0.428,0.095 0|0:0.825:0.355,0.470:0.342,0.491,0.167 0|0:0.468:0.181,0.287:0.584,0.364,0.052 0|0:0.761:0.459,0.303:0.377,0.484,0.139 0|0:0.631:0.346,0.285:0.467,0.434,0.099 0|0:0.847:0.402,0.445:0.332,0.489,0.179 0|0:0.640:0.309,0.331:0.462,0.435,0.102 0|0:0.633:0.336,0.298:0.467,0.433,0.100 0|0:0.633:0.336,0.298:0.467,0.433,0.100 0|0:0.562:0.231,0.331:0.515,0.409,0.076 0|0:0.771:0.309,0.462:0.372,0.486,0.143 0|0:0.763:0.397,0.366:0.383,0.472,0.145 1|1:1.534:0.816,0.718:0.052,0.362,0.586 1|1:1.472:0.728,0.744:0.070,0.389,0.542 1|0:0.855:0.728,0.126:0.237,0.671,0.092 0|0:0.501:0.276,0.226:0.561,0.377,0.062 0|0:0.604:0.386,0.219:0.480,0.436,0.084 0|0:0.683:0.327,0.355:0.433,0.450,0.116 0|0:0.755:0.395,0.360:0.387,0.471,0.142 0|0:0.652:0.305,0.347:0.454,0.440,0.106 1|0:0.976:0.676,0.300:0.227,0.570,0.203 0|0:0.744:0.365,0.379:0.394,0.467,0.138 0|1:1.207:0.487,0.720:0.144,0.506,0.351 1|0:0.902:0.519,0.382:0.297,0.505,0.199 0|0:0.806:0.468,0.338:0.352,0.490,0.158 0|0:0.582:0.241,0.341:0.500,0.418,0.082 1|0:0.809:0.656,0.153:0.292,0.608,0.100 0|0:0.801:0.316,0.485:0.352,0.495,0.153 0|0:0.716:0.363,0.353:0.412,0.460,0.128 0|0:0.721:0.278,0.443:0.402,0.475,0.123 0|0:0.804:0.386,0.418:0.357,0.481,0.161 0|0:0.517:0.218,0.299:0.548,0.387,0.065 0|0:0.436:0.258,0.178:0.610,0.344,0.046 0|0:0.763:0.397,0.366:0.383,0.472,0.145 1|0:0.840:0.727,0.113:0.242,0.675,0.082 0|0:0.446:0.301,0.145:0.597,0.359,0.044 0|1:0.859:0.131,0.728:0.236,0.669,0.095 0|0:0.509:0.131,0.378:0.540,0.410,0.049 1|0:0.797:0.689,0.108:0.277,0.649,0.074 0|0:0.458:0.401,0.057:0.565,0.412,0.023 0|0:0.257:0.041,0.215:0.752,0.239,0.009 0|1:0.977:0.300,0.676:0.227,0.570,0.203
zcat: error writing to output: Broken pipe

Read in Sharp et al., 2019 supplemental tables and organize a list of SNPs in the originally-published GRS

setwd(dir.GRSoriginal.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
sharpS1 <- read.xlsx("apt15826-sup-0001-supinfo.xlsx", sheet = "Table S1", startRow = 3)
sharpS2 <- read.xlsx("apt15826-sup-0001-supinfo.xlsx", sheet = "Table S2", startRow = 3)
sharpS3 <- read.xlsx("apt15826-sup-0001-supinfo.xlsx", sheet = "Table S3", startRow = 3)

sharpS1
sharpS2
sharpS3

rsIDs.GRSorig <- rbind(
  c(sharpS1$SNP1, sharpS1$SNP2) %>% as.data.frame() %>% `colnames<-`("GRS_rsID"),
  sharpS3 %>% select(SNP) %>% rename(GRS_rsID = SNP) )

rsIDs.GRSorig

Download the documentation provided for the revised CD GRS

https://github.com/sethsh7/hla-prs-toolkit

# Raw link: https://raw.github.com/<username>/<repo>/<branch>/Excelfile.xlsx

#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised'
#wget https://github.com/sethsh7/hla-prs-toolkit/raw/main/Tools/Snplists/CD_GRS42/CD_GRS42_1000G_nopalin_pos_hg19.xlsx

#wget https://github.com/sethsh7/hla-prs-toolkit/raw/main/Tools/Snplists/CD_GRS42/mapping_1000G.txt

#wget https://github.com/sethsh7/hla-prs-toolkit/raw/main/Tools/Snplists/CD_GRS42/mapping_HRC_TOPMED.txt

#wget https://github.com/sethsh7/hla-prs-toolkit/raw/main/Tools/Snplists/CD_GRS42/scorefile.txt

Read in workbook of annotation for SNPs in the revised GRS (2022) and prepare a dataframe of the SNP rsIDs, chromosome and base-pair locations

setwd(dir.GRSrevised.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
GRS.revised <- read.xlsx("CD_GRS42_1000G_nopalin_pos_hg19.xlsx")

GRS.revised

rsIDs.GRSrevised <- GRS.revised %>%
  select(RSID, POSITION_DBSNP151) %>%
  rename(GRS_rsID = RSID) %>%
  separate(POSITION_DBSNP151, into = c("CHR", "BP"), sep = ":", extra = "merge", remove = TRUE)

rsIDs.GRSrevised

Output a list for each version of the GRS to input to the UCSC Table Browser

https://genome.ucsc.edu/cgi-bin/hgTables

rsIDlist.GRSorig <- rsIDs.GRSorig %>% select(GRS_rsID)
rsIDlist.GRSrevised <- rsIDs.GRSrevised %>% select(GRS_rsID)

rsIDlist.GRSorig
rsIDlist.GRSrevised

setwd(dir.Data)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
fwrite(rsIDlist.GRSorig, "MEGA_041822_GRSoriginal_rsID_list_v0.1_JRS.txt",
       sep = "\t", quote = FALSE, col.names = FALSE, row.names = FALSE)
fwrite(rsIDlist.GRSrevised, "MEGA_041822_GRSrevised_rsID_list_v0.1_JRS.txt",
       sep = "\t", quote = FALSE, col.names = FALSE, row.names = FALSE)
Upload the files produced above to the Hg Tables site (https://genome.ucsc.edu/cgi-bin/hgTables), download the results, then move them into the manuscript data folder
#cp -a '/Users/shawjes/Downloads/MEGA_041822_Annotation_GRh37_GRSoriginal_rsID_list_v0.1_JRS.csv' '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal'

#cp -a '/Users/shawjes/Downloads/MEGA_041822_Annotation_GRh37_GRSrevised_rsID_list_v0.1_JRS.csv' '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised'

Remove the # in the first column name of the downloaded annotation data

https://stackoverflow.com/questions/32004950/how-to-replace-string-in-a-file-in-place-using-sed

#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal'
#sed -i '' 's/\#//g' 'MEGA_041822_Annotation_GRh37_GRSoriginal_rsID_list_v0.1_JRS.csv'

#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised'
#sed -i '' 's/\#//g' 'MEGA_041822_Annotation_GRh37_GRSrevised_rsID_list_v0.1_JRS.csv'

Read in the annotation data collected via the UCSC Table Browser and prepare files for use with BCFtools –regions

setwd(dir.GRSoriginal.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
GRCh37.GRSorig <- fread("MEGA_041822_Annotation_GRh37_GRSoriginal_rsID_list_v0.1_JRS.csv") %>%
  rename(GRS_rsID = name, Chr = chrom, BP = chromEnd) %>%
  select(GRS_rsID, Chr, BP) %>%  # Note: I have previously determined that the coordinates in the MEGA *.bim file match up with the chromEnd column exported from the Table Browser, at least for the SNPs in this GRS.
  filter(grepl("_", Chr)==FALSE) %>% # Note: I have previously determined that we do not need to consider the alternative mappings for the HLA region SNPs (e.g., 'chr6_ssto_hap7' or 'chr6_qbl_hap6'), so we will exclude those rows from the dataframe
  mutate(Chr = gsub("chr", "", Chr) %>% as.numeric())
Warning in fread("MEGA_041822_Annotation_GRh37_GRSoriginal_rsID_list_v0.1_JRS.csv") :
  Previous fread() session was not cleaned up properly. Cleaned up ok at the beginning of this fread() call.
setwd(dir.GRSrevised.Anno)
GRCh37.GRSrevised <- fread("MEGA_041822_Annotation_GRh37_GRSrevised_rsID_list_v0.1_JRS.csv") %>%
  rename(GRS_rsID = name, Chr = chrom, BP = chromEnd) %>%
  select(GRS_rsID, Chr, BP) %>%  # Note: I have previously determined that the coordinates in the MEGA *.bim file match up with the chromEnd column exported from the Table Browser, at least for the SNPs in this GRS.
  filter(grepl("_", Chr)==FALSE) %>% # Note: I have previously determined that we do not need to consider the alternative mappings for the HLA region SNPs (e.g., 'chr6_ssto_hap7' or 'chr6_qbl_hap6'), so we will exclude those rows from the dataframe
  mutate(Chr = gsub("chr", "", Chr) %>% as.numeric())

GRCh37.GRSorig
GRCh37.GRSrevised

Verify the mapping of the SNPs in the annotation provided for the revised GRS

setwd(dir.GRSrevised.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
anno.revisedGRS <- read.xlsx("CD_GRS42_1000G_nopalin_pos_hg19.xlsx")

anno.revisedGRS %>%
  select(RSID, POSITION_DBSNP151) %>%
  separate(POSITION_DBSNP151, into = c("Chr", "BP"), sep = ":") %>%
  rename(GRS_rsID = RSID) %>%
  full_join(GRCh37.GRSrevised, by = "GRS_rsID") %>%
  filter(Chr.x != Chr.y | BP.x != BP.y)
# 0 rows = all good.

Create a dataframe of the locations of the SNPs in the original GRS and the revised GRS

to_extract <- rbind(GRCh37.GRSorig %>%
                      mutate(GRS_version = "Original"),
                    GRCh37.GRSrevised %>%
                      mutate(GRS_version = "Revised")) %>%
  mutate(CHR_BP = paste(Chr, BP, sep = ":")) %>%
  arrange(CHR_BP) %>%
  mutate(Indicator = 1) %>%
  spread(key = GRS_version, value = Indicator) %>%
  rename(In_Original_GRS = Original,
         In_Revised_GRS = Revised) %>%
  mutate(In_Original_GRS = ifelse(is.na(In_Original_GRS), 0, In_Original_GRS),
         In_Revised_GRS = ifelse(is.na(In_Revised_GRS), 0, In_Revised_GRS))

to_extract

FOLLOW UP

Compare the mapping of the original GRS SNPs to their replacement SNPs to assess if the putative gene is likely the same

Follow-up email to Sharp team to confirm that putative genes are assumed to still be the same in the revised GRS (this will impact Neetha’s multi-omics figures)


# FOLLOW-UP
# Use this to determine how far apart the original vs. replacement SNPs are from one another.

to_extract

Get a long string of the locations of GRS SNPs separated by commas

(View the console to copy the full string)

to_extract$CHR_BP %>%
  paste(collapse = ",")
[1] "2:68645560,2:182007800,6:32627713,6:408079,1:200881392,11:118579865,1:172862984,14:69259502,18:12843137,1:172681031,1:172864652,10:81058027,2:61186829,4:123551114,1:192541021,3:159623559,1:192541472,15:75096443,6:29828916,6:32673893,6:138005515,6:159469574,21:43855067,2:204610396,3:188119901,6:32605884,6:33034596,10:6390192,3:159674928,6:33074288,12:111884608,6:32681530,6:31348365,1:2539400,22:21979289,6:128293562,3:119123278,11:128391937,16:10964118,2:191913034,6:33079812,11:111196858,6:32603374,3:46205686,6:32658079,6:32620628,6:32671412,10:6390450,2:103086770"

Use bcftools view with the string produced above to extract the GRS SNPs from the imputed MEGA data

# https://samtools.github.io/bcftools/bcftools.html
# bcftools -r, --regions chr|chr:pos|chr:from-to|chr:from-[,…​]

cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
bcftools view \
--regions \
2:68645560,2:182007800,6:32627713,6:408079,1:200881392,11:118579865,1:172862984,14:69259502,18:12843137,1:172681031,1:172864652,10:81058027,2:61186829,4:123551114,1:192541021,3:159623559,1:192541472,15:75096443,6:29828916,6:32673893,6:138005515,6:159469574,21:43855067,2:204610396,3:188119901,6:32605884,6:33034596,10:6390192,3:159674928,6:33074288,12:111884608,6:32681530,6:31348365,1:2539400,22:21979289,6:128293562,3:119123278,11:128391937,16:10964118,2:191913034,6:33079812,11:111196858,6:32603374,3:46205686,6:32658079,6:32620628,6:32671412,10:6390450,2:103086770 \
'MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz' \
--output 'MEGA_041822_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.vcf.gz'

Preview the new VCF of extracted GRS SNPs

cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
zcat < 'MEGA_041822_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.vcf.gz' | head -n 46
##fileformat=VCFv4.1
##FILTER=<ID=PASS,Description="All filters passed">
##filedate=2022.4.12
##contig=<ID=1>
##INFO=<ID=AF,Number=1,Type=Float,Description="Estimated Alternate Allele Frequency">
##INFO=<ID=MAF,Number=1,Type=Float,Description="Estimated Minor Allele Frequency">
##INFO=<ID=R2,Number=1,Type=Float,Description="Estimated Imputation Accuracy (R-square)">
##INFO=<ID=ER2,Number=1,Type=Float,Description="Empirical (Leave-One-Out) R-square (available only for genotyped variants)">
##INFO=<ID=IMPUTED,Number=0,Type=Flag,Description="Marker was imputed but NOT genotyped">
##INFO=<ID=TYPED,Number=0,Type=Flag,Description="Marker was genotyped AND imputed">
##INFO=<ID=TYPED_ONLY,Number=0,Type=Flag,Description="Marker was genotyped but NOT imputed">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=DS,Number=1,Type=Float,Description="Estimated Alternate Allele Dosage : [P(0/1)+2*P(1/1)]">
##FORMAT=<ID=HDS,Number=2,Type=Float,Description="Estimated Haploid Alternate Allele Dosage">
##FORMAT=<ID=GP,Number=3,Type=Float,Description="Estimated Posterior Probabilities for Genotypes 0/0, 0/1 and 1/1">
##pipeline=michigan-imputationserver-1.6.6
##imputation=minimac4-1.0.2
##phasing=eagle-2.4
##panel=apps@1000g-phase-3-v5
##r2Filter=0.0
##contig=<ID=2>
##contig=<ID=3>
##contig=<ID=4>
##contig=<ID=5>
##contig=<ID=6>
##contig=<ID=7>
##contig=<ID=8>
##contig=<ID=9>
##contig=<ID=10>
##contig=<ID=11>
##contig=<ID=12>
##contig=<ID=13>
##contig=<ID=14>
##contig=<ID=15>
##contig=<ID=16>
##contig=<ID=17>
##contig=<ID=18>
##contig=<ID=19>
##contig=<ID=20>
##contig=<ID=22>
##bcftools_concatVersion=1.14+htslib-1.14
##bcftools_concatCommand=concat -Oz -o /Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz chr1.dose.vcf.gz chr2.dose.vcf.gz chr3.dose.vcf.gz chr4.dose.vcf.gz chr5.dose.vcf.gz chr6.dose.vcf.gz chr7.dose.vcf.gz chr8.dose.vcf.gz chr9.dose.vcf.gz chr10.dose.vcf.gz chr11.dose.vcf.gz chr12.dose.vcf.gz chr13.dose.vcf.gz chr14.dose.vcf.gz chr15.dose.vcf.gz chr16.dose.vcf.gz chr17.dose.vcf.gz chr18.dose.vcf.gz chr19.dose.vcf.gz chr20.dose.vcf.gz chr22.dose.vcf.gz; Date=Wed Apr 13 15:23:47 2022
##bcftools_viewVersion=1.14+htslib-1.14
##bcftools_viewCommand=view --regions 2:68645560,2:182007800,6:32627713,6:408079,1:200881392,11:118579865,1:172862984,14:69259502,18:12843137,1:172681031,1:172864652,10:81058027,2:61186829,4:123551114,1:192541021,3:159623559,1:192541472,15:75096443,6:29828916,6:32673893,6:138005515,6:159469574,21:43855067,2:204610396,3:188119901,6:32605884,6:33034596,10:6390192,3:159674928,6:33074288,12:111884608,6:32681530,6:31348365,1:2539400,22:21979289,6:128293562,3:119123278,11:128391937,16:10964118,2:191913034,6:33079812,11:111196858,6:32603374,3:46205686,6:32658079,6:32620628,6:32671412,10:6390450,2:103086770 --output MEGA_041822_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.vcf.gz MEGA_041122_Espinosa08132019QCpass_IMPUTEDwithPhasing_ref1000G3v5_autosomesNoChr21_v0.1_JRS.vcf.gz; Date=Fri Apr 22 18:36:43 2022
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  1_WG1-DNA_A01_NA19235   2_WG1-DNA_B01_HTP0207A  3_WG1-DNA_C01_HTP0207A  4_WG1-DNA_D01_HTP0222A  5_WG1-DNA_E01_HTP0442A  6_WG1-DNA_F01_HTP0219A  7_WG1-DNA_G01_HTP0465A  8_WG1-DNA_H01_HTP0119A  9_WG1-DNA_B02_HTP0223A  10_WG1-DNA_C02_HTP0471A 11_WG1-DNA_D02_HTP0213A 12_WG1-DNA_E02_HTP0220A 13_WG1-DNA_F02_HTP0224A 14_WG1-DNA_G02_HTP0123A 15_WG1-DNA_H02_HTP0151A 16_WG1-DNA_A03_HTP0215A 17_WG1-DNA_B03_HTP0265A 18_WG1-DNA_C03_HTP0129A 19_WG1-DNA_D03_HTP0198A 20_WG1-DNA_E03_HTP0221A 21_WG1-DNA_F03_HTP0204A 22_WG1-DNA_G03_HTP0217A 23_WG1-DNA_H03_HTP0415A 24_WG1-DNA_A04_HTP0139A 25_WG1-DNA_B04_HTP0218A 26_WG1-DNA_C04_HTP0254A 27_WG1-DNA_D04_HTP0232A 28_WG1-DNA_E04_HTP0238A 29_WG1-DNA_F04_HTP0241A 30_WG1-DNA_G04_HTP0249A 31_WG1-DNA_H04_HTP0258A 32_WG1-DNA_A05_HTP0261A 33_WG1-DNA_B05_HTP0266A 34_WG1-DNA_C05_HTP0226A 35_WG1-DNA_D05_HTP0250A 36_WG1-DNA_E05_HTP0227A 37_WG1-DNA_F05_HTP0233A 38_WG1-DNA_G05_HTP0243A 39_WG1-DNA_H05_HTP0262A 40_WG1-DNA_A06_NA19236  41_WG1-DNA_B06_HTP0267A 42_WG1-DNA_C06_HTP0267A 43_WG1-DNA_D06_HTP0228A 44_WG1-DNA_E06_HTP0251A 45_WG1-DNA_F06_HTP0256A 46_WG1-DNA_G06_HTP0259A 47_WG1-DNA_H06_HTP0234A 48_WG1-DNA_A07_HTP0263A 49_WG1-DNA_B07_HTP0268A 50_WG1-DNA_C07_HTP0229A 51_WG1-DNA_D07_HTP0239A 52_WG1-DNA_E07_HTP0245A 53_WG1-DNA_F07_HTP0253A 54_WG1-DNA_G07_HTP0235A 55_WG1-DNA_H07_HTP0257A 56_WG1-DNA_A08_HTP0260A 57_WG1-DNA_B08_HTP0230A 58_WG1-DNA_C08_HTP0236A 59_WG1-DNA_D08_HTP0240A 60_WG1-DNA_E08_HTP0247A 61_WG1-DNA_F08_HTP0264A 62_WG1-DNA_G08_HTP0269A 63_WG1-DNA_H08_HTP0306A 64_WG1-DNA_A09_HTP0318A 65_WG1-DNA_B09_HTP0084A2    66_WG1-DNA_C09_HTP0270A 67_WG1-DNA_D09_HTP0275A 68_WG1-DNA_E09_HTP0293A 69_WG1-DNA_F09_HTP0300A 70_WG1-DNA_G09_HTP0328A 71_WG1-DNA_H09_HTP0337A 72_WG1-DNA_A10_HTP0310A 73_WG1-DNA_B10_HTP0319A 74_WG1-DNA_C10_HTP0345A 75_WG1-DNA_D10_HTP0272A 76_WG1-DNA_E10_HTP0276A 77_WG1-DNA_F10_HTP0295A 78_WG1-DNA_G10_HTP0301A 79_WG1-DNA_H10_HTP0331A 80_WG1-DNA_A11_HTP0012A2    81_WG1-DNA_B11_HTP0320A 82_WG1-DNA_C11_HTP0303A 83_WG1-DNA_D11_HTP0315A 84_WG1-DNA_E11_HTP0332A 85_WG1-DNA_F11_HTP0273A 86_WG1-DNA_G11_HTP0277A 87_WG1-DNA_H11_HTP0296A 88_WG1-DNA_A12_NA19237  89_WG1-DNA_B12_HTP0334A 90_WG1-DNA_C12_HTP0023A2    91_WG1-DNA_D12_HTP0274A 92_WG1-DNA_E12_HTP0326A 93_WG1-DNA_F12_HTP0335A 94_WG1-DNA_G12_HTP0348A 95_WG1-DNA_H12_HTP0080A2    96_WG2-DNA_B01_HTP0036A2    97_WG2-DNA_C01_HTP0036A2    98_WG2-DNA_D01_HTP0394A 99_WG2-DNA_E01_HTP0350A 100_WG2-DNA_F01_HTP0382A    101_WG2-DNA_G01_HTP0391A    102_WG2-DNA_H01_HTP0398A    103_WG2-DNA_C02_HTP0378A    104_WG2-DNA_D02_HTP0387A    105_WG2-DNA_E02_HTP0395A    106_WG2-DNA_F02_HTP0351A    107_WG2-DNA_G02_HTP0388A    108_WG2-DNA_C03_HTP0384A    109_WG2-DNA_D03_HTP0389A    110_WG2-DNA_E03_HTP0392A    111_WG2-DNA_F03_HTP0052A2   112_WG2-DNA_G03_HTP0373A    113_WG2-DNA_H03_HTP0396A    114_WG2-DNA_B04_HTP0050A2   115_WG2-DNA_C04_HTP0380A    116_WG2-DNA_D04_HTP0385A    117_WG2-DNA_E04_HTP0053A2   118_WG2-DNA_F04_HTP0374A    119_WG2-DNA_G04_HTP0381A    120_WG2-DNA_A05_HTP0393A    121_WG2-DNA_C05_HTP0375A    122_WG2-DNA_D05_HTP0386A    123_WG2-DNA_E05_HTP0397A    124_WG2-DNA_F05_HTP0406A    125_WG2-DNA_G05_HTP0412A    126_WG2-DNA_H05_HTP0422A    127_WG2-DNA_D06_HTP0402A    128_WG2-DNA_E06_HTP0426A    129_WG2-DNA_F06_HTP0435A    130_WG2-DNA_G06_HTP0403A    131_WG2-DNA_H06_HTP0413A    132_WG2-DNA_A07_HTP0419A    133_WG2-DNA_B07_HTP0423A    134_WG2-DNA_C07_HTP0407A    135_WG2-DNA_D07_HTP0410A    136_WG2-DNA_E07_HTP0433A    137_WG2-DNA_F07_HTP0404A    138_WG2-DNA_G07_HTP0408A    139_WG2-DNA_H07_HTP0428A    140_WG2-DNA_A08_HTP0436A    141_WG2-DNA_B08_HTP0414A    142_WG2-DNA_C08_HTP0420A    143_WG2-DNA_D08_HTP0424A    144_WG2-DNA_E08_HTP0411A    145_WG2-DNA_F08_HTP0430A    146_WG2-DNA_G08_HTP0437A    147_WG2-DNA_H08_HTP0405A    148_WG2-DNA_A09_HTP0409A    149_WG2-DNA_B09_HTP0416A    150_WG2-DNA_C09_HTP0421A    151_WG2-DNA_D09_HTP0425A    152_WG2-DNA_E09_HTP0434A    153_WG2-DNA_F09_HTP0418A    154_WG2-DNA_G09_HTP0443A    155_WG2-DNA_H09_HTP0450A    156_WG2-DNA_D10_HTP0469A    157_WG2-DNA_E10_HTP0456A    158_WG2-DNA_F10_HTP0475A    159_WG2-DNA_G10_HTP0480A    160_WG2-DNA_H10_HTP0438A    161_WG2-DNA_A11_HTP0445A    162_WG2-DNA_B11_HTP0451A    163_WG2-DNA_C11_HTP0461A    164_WG2-DNA_D11_HTP0467A    165_WG2-DNA_E11_HTP0476A    166_WG2-DNA_F11_HTP0439A    167_WG2-DNA_G11_HTP0448A    168_WG2-DNA_H11_HTP0458A    169_WG2-DNA_B12_HTP0482A    170_WG2-DNA_C12_HTP0452A    171_WG2-DNA_D12_HTP0462A    172_WG2-DNA_E12_HTP0478A    173_WG2-DNA_F12_HTP0459A    174_WG2-DNA_G12_HTP0468A    175_WG2-DNA_H12_HTP0484A    176_WG3-DNA_A01_NA19235 177_WG3-DNA_B01_HTP0440A    178_WG3-DNA_C01_HTP0440A    179_WG3-DNA_D01_HTP0449A    180_WG3-DNA_E01_HTP0463A    181_WG3-DNA_F01_HTP0479A    182_WG3-DNA_G01_HTP0453A    183_WG3-DNA_H01_HTP0515A    184_WG3-DNA_C02_HTP0519A    185_WG3-DNA_D02_HTP0005A3   186_WG3-DNA_E02_HTP0516A    187_WG3-DNA_F02_HTP0517A    188_WG3-DNA_G02_HTP0329A2   189_WG3-DNA_H02_HTP0015A3   190_WG3-DNA_C03_HTP0333A3   191_WG3-DNA_D03_HTP0112A2   192_WG3-DNA_E03_HTP0512A    193_WG3-DNA_F03_HTP0324A2   194_WG3-DNA_G03_HTP0340A2   195_WG3-DNA_H03_HTP0510A    198_WG3-DNA_F04_HTP0336A    199_WG3-DNA_G04_HTP0203A    200_WG3-DNA_H04_HTP0278A    201_WG3-DNA_A05_HTP0483A    202_WG3-DNA_B05_HTP0498B    203_WG3-DNA_C05_HTP0432A    204_WG3-DNA_D05_HTP0369A    205_WG3-DNA_E05_HTP0561A    206_WG3-DNA_F05_HTP0566A    207_WG3-DNA_G05_HTP0496B    208_WG3-DNA_H05_HTP0497B    209_WG4-DNA_D06_NA19235 210_WG4-DNA_E06_NA19237 211_WG5-DNA_F06_NA19174 212_WG5-DNA_G06_NA19117 214_WG6-DNA_B01_HTP0073A2   215_WG6-DNA_C01_HTP0054A2   216_WG6-DNA_D01_HTP0400A    217_WG6-DNA_E01_HTP0454A    218_WG6-DNA_F01_HTP0298A2   221_WG6-DNA_A02_HTP0431A    222_WG6-DNA_B02_HTP0460A    223_WG6-DNA_C02_HTP0464A    224_WG6-DNA_D02_HTP0399A    225_WG6-DNA_E02_HTP0390A    226_WG6-DNA_F02_HTP0017A4   227_WG6-DNA_G02_HTP0025A3   228_WG6-DNA_H02_HTP0514A    230_WG6-DNA_B03_HTP0066A2   231_WG6-DNA_C03_HTP0518A    232_WG6-DNA_D03_HTP0525A    233_WG6-DNA_E03_HTP0624A    234_WG6-DNA_F03_HTP0103A2   235_WG7-DNA_G03_NA19235 236_WG7-DNA_H03_NA19236 238_WG8-DNA_B04_NA18867 239_WG8-DNA_C04_NA18868 240_WG8-DNA_D04_NA18869 241_WG6-DNA_E04_NA19189 242_WG6-DNA_F04_NA19190 243_WG6-DNA_G04_NA19191 244_WG6-DNA_H04_HTP0431A
2   61186829    2:61186829:A:G  A   G   .   PASS    AF=0.40611;MAF=0.40611;R2=0.9961;ER2=0.96354;TYPED  GT:DS:HDS:GP    1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0.001:0.001,0:0.999,0.001,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|1:1.999:1,0.999:0,0.001,0.999 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|1:1.998:0.998,1:0,0.002,0.998 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|0:0.972:0.972,0:0.028,0.972,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 0|0:0.009:0.001,0.008:0.991,0.009,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0.012:0,0.012:0.988,0.012,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|0:0.012:0.012,0:0.988,0.012,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|1:1.492:0.746,0.746:0.065,0.379,0.556 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 0|1:1:0,1:0,1,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 0|1:1:0,1:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 0|0:0:0,0:1,0,0 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|1:2:1,1:0,0,1 1|0:1:1,0:0,1,0
zcat: error writing to output: Broken pipe

Of the 45 SNPs we tried to extract, how many did we get?

inventory <- imputed.traw %>%
  select(-c(IID, Dosage.COUNTED)) %>%
  unique() %>%
  select(GRS_rsID, CHR, POS, CHR_POS, In_Original_GRS, In_Revised_GRS, everything())

inventory

inventory %>% filter(Extracted == 0)

inventory %>%
  filter(In_Original_GRS == 1) %>%
  group_by(CHR, In_Original_GRS, Extracted) %>%
  summarise(N = n())
`summarise()` has grouped output by 'CHR', 'In_Original_GRS'. You can override using the `.groups` argument.
  
inventory %>%
  filter(In_Revised_GRS == 1) %>%
  group_by(CHR, In_Revised_GRS, Extracted) %>%
  summarise(N = n())
`summarise()` has grouped output by 'CHR', 'In_Revised_GRS'. You can override using the `.groups` argument.
print("Perfect, we got all of the SNPs except for the one located on Chromosome 21, which we purposely excluded from imputation and will deal with later.")
[1] "Perfect, we got all of the SNPs except for the one located on Chromosome 21, which we purposely excluded from imputation and will deal with later."

Clean up the traw dataframe a bit

Verify that we got back only one unique SNP for each CHR:BP extracted from the imputed dataset

imputed.traw01 %>%
  select(-c(IID, Dosage.COUNTED)) %>%
  unique() %>%
  mutate(CHR_POS = paste(CHR, POS, sep = ":")) %>%
  select(CHR_POS, VCF_VariantID) %>%
  unique() %>%
  group_by(CHR_POS)  %>%
  summarise(N_SNPs_at_ChrBP = n()) %>%
  arrange(desc(N_SNPs_at_ChrBP))

Extract imputation quality info using bcftools

# Print chromosome, position, ref allele and the first alternate allele

#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
#bcftools query -f '%CHROM  %POS  %REF  %ALT{0} %INFO\n' 'MEGA_041822_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.vcf.gz' > 'MEGA_041822_QualityINFO_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.txt'

#cat 'MEGA_041822_QualityINFO_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.txt'

Clean the extracted VCF INFO field

setwd(dir.Data)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
extracted.INFO <- fread("MEGA_041822_QualityINFO_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.txt") %>%
  `colnames<-`(c("CHR", "POS", "REF", "ALT", "INFO")) %>%
  separate(INFO, into = c("AF", "MAF", "R2", "temp1", "temp2"), sep = ";", extra = "merge", remove = FALSE) %>%
  mutate(ER2 = ifelse(grepl("ER2", temp1)==TRUE, temp1, NA),
         Type = ifelse(grepl("ER2", temp1)==FALSE, temp1, temp2)) %>%
  select(-c(temp1, temp2)) %>%
  mutate(AF = gsub("AF=", "", AF),
         MAF = gsub("MAF=", "", MAF),
         R2 = gsub("R2=", "", R2),
         ER2 = gsub("ER2=", "", ER2))
Warning: Expected 5 pieces. Missing pieces filled with `NA` in 32 rows [2, 3, 5, 7, 10, 12, 13, 14, 16, 21, 22, 23, 24, 25, 26, 27, 29, 30, 32, 33, ...].
extracted.INFO

Clean up the VCF INFO dataframe, split it by GRS version, and output to annotation files

imputationQCinfo <- extracted.INFO %>%
  full_join(inventory, by = intersect(colnames(extracted.INFO), colnames(inventory)))

#imputationQCinfo

imputationQCinfo.GRSorig <- imputationQCinfo %>%
  rename(VCF_VariantID = SNP) %>%
  filter(In_Original_GRS == 1) %>%
  select(-c(In_Original_GRS, In_Revised_GRS)) %>%
  mutate(GRS_version = "Sharp et al., 2019") %>%
  select(GRS_version, GRS_rsID, VCF_VariantID, CHR, POS, REF, ALT, COUNTED, everything()) %>%
  select(-c(CHR_POS)) %>%
  rename(COUNTED_in_traw = COUNTED) %>%
  mutate(Build = "GRCh37")

imputationQCinfo.GRSrevised <- imputationQCinfo %>%
  rename(VCF_VariantID = SNP) %>%
  filter(In_Revised_GRS == 1) %>%
  select(-c(In_Original_GRS, In_Revised_GRS)) %>%
  mutate(GRS_version = "Sharp et al., 2022") %>%
  select(GRS_version, GRS_rsID, VCF_VariantID, CHR, POS, REF, ALT, COUNTED, everything()) %>%
  select(-c(CHR_POS)) %>%
  rename(COUNTED_in_traw = COUNTED) %>%
  mutate(Build = "GRCh37")

imputationQCinfo.GRSorig

imputationQCinfo.GRSrevised

setwd(dir.GRSoriginal.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSoriginal inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
fwrite(imputationQCinfo.GRSorig, "MEGA_041822_CD_GRS_Sharp2019_ImputationQCinfo_GRCh37_v0.1_JRS.csv")

setwd(dir.GRSrevised.Anno)
fwrite(imputationQCinfo.GRSrevised, "MEGA_041822_CD_GRS_Sharp2022_ImputationQCinfo_GRCh37_v0.1_JRS.csv")

imputed.traw.GRSorig <- imputationQCinfo.GRSorig %>%
  rename(COUNTED = COUNTED_in_traw) %>%
  left_join(imputed.traw01,
            by = intersect(colnames(imputationQCinfo.GRSorig %>% rename(COUNTED = COUNTED_in_traw)),
                           colnames(imputed.traw01))) %>%
  select(-c(Extracted, In_Original_GRS, In_Revised_GRS)) %>%
  select(GRS_version,
         GRS_rsID,
         VCF_VariantID, IID, COUNTED, Dosage.COUNTED, 
         CHR, POS, REF, ALT, INFO, AF, MAF, R2, ER2, Type,
         everything()) %>%
  mutate(temp = gsub("_WG", "_|WG", IID)) %>%
  separate(temp, into = c("rm", "MEGA.IID"), sep = "[|]", extra = "merge", remove = FALSE) %>%
  select(-c(IID, temp, rm)) %>%
  select(GRS_version, MEGA.IID, GRS_rsID, VCF_VariantID,
         COUNTED, Dosage.COUNTED, everything()) %>%
  unique()

imputed.traw.GRSrevised <- imputationQCinfo.GRSrevised %>%
  rename(COUNTED = COUNTED_in_traw) %>%
  left_join(imputed.traw01,
            by = intersect(colnames(imputationQCinfo.GRSrevised %>% rename(COUNTED = COUNTED_in_traw)),
                           colnames(imputed.traw01))) %>%
  select(-c(Extracted, In_Original_GRS, In_Revised_GRS)) %>%
  select(GRS_version,
         GRS_rsID,
         VCF_VariantID, IID, COUNTED, Dosage.COUNTED, 
         CHR, POS, REF, ALT, INFO, AF, MAF, R2, ER2, Type,
         everything()) %>%
  mutate(temp = gsub("_WG", "_|WG", IID)) %>%
  separate(temp, into = c("rm", "MEGA.IID"), sep = "[|]", extra = "merge", remove = FALSE) %>%
  select(-c(IID, temp, rm)) %>%
  select(GRS_version, MEGA.IID, GRS_rsID, VCF_VariantID,
         COUNTED, Dosage.COUNTED, everything()) %>%
  unique()

imputed.traw.GRSorig

imputed.traw.GRSrevised

Add HTP study identifiers (FamilyID, RecordID, LabID)


setwd(dir.Data)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
MEGA.IDkey <- fread("MEGA_041822_MEGA2_to_HTP_ID_key_v0.1_JRS.csv") %>%
  filter(HTP_participant == "Yes") %>%
  select(FamilyID, RecordID, MEGA.FID, MEGA.IID, MEGA.LabID) %>%
  unique()

imputed.traw.GRSorig01 <- imputed.traw.GRSorig %>%
  full_join(MEGA.IDkey, by = "MEGA.IID") %>%
  select(FamilyID, RecordID, MEGA.FID, MEGA.IID, MEGA.LabID, GRS_rsID, COUNTED, Dosage.COUNTED, everything()) %>%
  unique()

imputed.traw.GRSrevised01 <- imputed.traw.GRSrevised %>%
  full_join(MEGA.IDkey, by = "MEGA.IID") %>%
  select(FamilyID, RecordID, MEGA.FID, MEGA.IID, MEGA.LabID, GRS_rsID, COUNTED, Dosage.COUNTED, everything()) %>%
  unique()

imputed.traw.GRSorig01
imputed.traw.GRSrevised01

Produce a summary of how far apart the ambiguous SNPs used in GRS 2019 are from their replacements used in the GRS 2022

deltaChrPos_replacedSNPs <- anno.revisedGRS %>%
  filter(!is.na(REPLACING)) %>%
  filter(COMPONENT == "Non-HLA") %>%
  rename(GRS_Component = COMPONENT,
         Score_Allele.revised = SCORE_ALLELE,
         `Score_Weight.revised` = SCORE,
         Strand.revised = STRAND) %>%
  rename(GRS_rsID.revised = RSID,
         GRS_rsID.original = REPLACING) %>%
  select(-c(`Freq_UKB(A1)`, `Freq_UKB(A2)`, `1000G?`,
            A1, A2)) %>%
  select(GRS_Component, GRS_rsID.revised, GRS_rsID.original, Score_Allele.revised, Score_Weight.revised, POSITION_DBSNP151) %>%
  separate(POSITION_DBSNP151, into = c("Chr_rsID.revised", "Pos_rsID.revised"), sep = ":", extra = "merge", remove = TRUE) %>%
  left_join(GRCh37.GRSorig %>%
              rename(GRS_rsID.original = GRS_rsID,
                     Chr_rsID.original = Chr,
                     Pos_rsID.original = BP),
            by = "GRS_rsID.original") %>%
  left_join(sharpS3 %>%
              select(Putative.Gene, SNP, Allele, `Weight.(β)`) %>%
              rename(Putative_Gene.original = Putative.Gene, GRS_rsID.original = SNP, Score_Allele.original = Allele, Score_Weight.original = `Weight.(β)`),
            by = "GRS_rsID.original") %>%
  select(GRS_Component,
         GRS_rsID.original, Score_Allele.original, Score_Weight.original, Chr_rsID.original, Pos_rsID.original,
         GRS_rsID.revised, Score_Allele.revised, Score_Weight.revised, Chr_rsID.revised, Pos_rsID.revised,
         everything()) %>%
  mutate(Chr_rsID.original = as.numeric(Chr_rsID.original),
         Chr_rsID.revised = as.numeric(Chr_rsID.revised),
         Pos_rsID.original = as.numeric(Pos_rsID.original),
         Pos_rsID.revised = as.numeric(Pos_rsID.revised)) %>%
  mutate(delta.Chr = Chr_rsID.revised - Chr_rsID.original,
         delta.Pos = Pos_rsID.revised - Pos_rsID.original) %>%
  select(GRS_rsID.original, GRS_rsID.revised, delta.Chr, delta.Pos, everything()) %>%
  select(GRS_rsID.original, GRS_rsID.revised, Chr_rsID.original, Pos_rsID.original, Chr_rsID.revised, Pos_rsID.revised, delta.Chr, delta.Pos)

deltaChrPos_replacedSNPs

setwd(dir.GRSrevised.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
fwrite(deltaChrPos_replacedSNPs, "MEGA_041822_DeltaChrPos_GRS_rsID_original_vs_replacement_v0.1_JRS.csv")
#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
#wget 'https://analysistools.cancer.gov/LDlink/tmp/LDpair_0418388542.txt'
#mv 'LDpair_0418388542.txt' 'LDpair_rs1359062_rs1323292.txt'
#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
#wget 'https://analysistools.cancer.gov/LDlink/tmp/LDpair_0438167674.txt'
#mv 'LDpair_0438167674.txt' 'LDpair_rs12142280_rs11801183.txt'
# rs2387397 rs947474
#cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
#wget 'https://analysistools.cancer.gov/LDlink/tmp/LDpair_0439208571.txt'
#mv 'LDpair_0439208571.txt' 'LDpair_rs2387397_rs947474.txt'
# "LDpair_rs12142280_rs11801183.txt" "LDpair_rs1359062_rs1323292.txt"   "LDpair_rs2387397_rs947474.txt"

setwd(dir.Data)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
data.LDpairs <- list.files(pattern = "LDpair") %>%
  lapply(fread, fill = TRUE)

data.LDpairs
[[1]]

[[2]]

[[3]]
temp <- list()
for ( i in 1:length(data.LDpairs) ){
  temp[[i]] <- data.LDpairs[[i]] %>% select(V1, V2) %>% filter(V1 == "D':" | V1 == "R2:" | V1 == "Chi-sq:" | V1 == "p-value:") %>%
    mutate(dummy = 1,
           V1 = gsub(":", "", V1),
           Population = data.LDpairs[[i]]$V1[5]) %>%
    spread(key = V1, value = V2) %>%
    select(-dummy) %>%
    cbind(.,
          data.LDpairs[[i]] %>%
            filter(grepl("rs", V1)==TRUE) %>%
            select(V1) %>%
            unique() %>%
            filter(grepl("[(]", V1)==FALSE) %>%
            t() %>%
            as.data.frame() %>%
            rename(SNP1 = V1, SNP2 = V2)) %>%
    # cbind(.,
    #       data.LDpairs[[i]] %>%
    #         filter(grepl("_", V1)==TRUE) %>%
    #         select(V1, V3) %>%
    #         unique() %>%
    #         rename(SNP1allele_SNP2allele = V1,
    #                Correlation = V3)) %>%
    #mutate(SNP1allele_SNP2allele = gsub("[:]", "", V1)) %>%
    #separate(SNP1allele_SNP2allele, into = c("SNP1_Allele", "SNP2_Allele"), sep = "_", extra = "merge", remove = TRUE) %>%
    select(Population, SNP1, SNP2,
           `D'`, R2, `Chi-sq`, `p-value`,
           #SNP1_Allele, SNP2_Allele,
           everything()) %>%
    rename(GRS_rsID.original = SNP1,
           GRS_rsID.revised = SNP2)
  #mutate(Correlation = gsub("[(]", "", Correlation),
  #       Correlation = gsub("[)]", "", Correlation))
}

LDstats <- temp %>% rbindlist()

LDstats

setwd(dir.GRSrevised.Anno)
fwrite(LDstats, "MEGA_041822_LD_GRS_rsID_original_vs_replacement_v0.1_JRS.csv")

#setwd(dir.GRSrevised.Anno)
#LDstats <- fread("MEGA_041822_LD_GRS_rsID_original_vs_replacement_v0.1_JRS.csv")
#LDstats

Verify that both dosage dataframes contain the same number of unique IIDs

imputed.traw.GRSorig01 %>%
  select(MEGA.IID) %>%
  unique() %>%
  nrow()
[1] 222
imputed.traw.GRSrevised01 %>%
  select(MEGA.IID) %>%
  unique() %>%
  nrow()
[1] 222

Create a dataframe that maps the rsIDs in the revised GRS to the corresponding Putative Gene reported in the Sharp 2019 paper, and to the ‘COMPONENT’ column in the annotation for the revised GRS


GRSrevised_map_PutativeGenes2019


setwd(dir.GRSrevised.Anno)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/GRSrevised inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
fwrite(GRSrevised_map_PutativeGenes2019, "MEGA_041822_GRS2022COMPONENT_to_GRS2019PutativeGene_GRS2019nonHLADQSNPsOnly_v0.1_JRS.csv")
setwd(dir.GRSoriginal.Anno)
fwrite(GRSrevised_map_PutativeGenes2019, "MEGA_041822_GRS2022COMPONENT_to_GRS2019PutativeGene_GRS2019nonHLADQSNPsOnly_v0.1_JRS.csv")

Produce a list of only the SNPs that are not haplotype-tagging SNPs used in either version of the GRS


nonHLADQ_SNPs.GRSrevised <- GRSrevised_map_PutativeGenes2019 %>%
  filter(`GRS Component (Sharp 2019)` == "Non-HLA-DQ") %>%
  select(`Variant (Sharp 2022)`) %>%
  unique()

nonHLADQ_SNPs.GRSorig

nonHLADQ_SNPs.GRSrevised

Filter the cleaned dataframes of dosage data to keep only the SNPs that are not for tagging of HLA-DQ haplotypes, because our GRS analysis uses the HIBAG-imputed HLA alleles to infer HLA-DQ genotypes

imputed.traw.GRSorig02 <- imputed.traw.GRSorig01 %>%
  filter(GRS_rsID %in% nonHLADQ_SNPs.GRSorig$`Variant (Sharp 2019)`)

imputed.traw.GRSrevised02 <- imputed.traw.GRSrevised01 %>%
  filter(GRS_rsID %in% nonHLADQ_SNPs.GRSrevised$`Variant (Sharp 2022)`)

imputed.traw.GRSorig02$GRS_rsID %>% unique() %>% length()
[1] 38
imputed.traw.GRSrevised02$GRS_rsID %>% unique() %>% length()
[1] 38
#[1] 38
#[1] 38

imputed.traw.GRSorig02
imputed.traw.GRSrevised02

print("We have now prepared one dataframe of non-HLA-DQ SNP dosage data for the rsIDs used in the GRS published in 2019, and one dataframe of non-HLA-DQ SNP dosage data for the rsIDs used in the revised GRS shared on github in 2022. In both cases the GRS involves a total of 38 non-HLA-DQ SNPs.")
[1] "We have now prepared one dataframe of non-HLA-DQ SNP dosage data for the rsIDs used in the GRS published in 2019, and one dataframe of non-HLA-DQ SNP dosage data for the rsIDs used in the revised GRS shared on github in 2022. In both cases the GRS involves a total of 38 non-HLA-DQ SNPs."

Verify that each version of the non-HLA-DQ SNP dosage data includes the same number of individuals (MEGA.IIDs)

imputed.traw.GRSorig02 %>%
  select(MEGA.IID) %>%
  unique() %>%
  nrow()
[1] 222
imputed.traw.GRSrevised02 %>%
  select(MEGA.IID) %>%
  unique() %>%
  nrow()
[1] 222
print("Non-HLA-DQ SNP dosage data for the 2019 GRS includes 222 IIDs.")
[1] "Non-HLA-DQ SNP dosage data for the 2019 GRS includes 222 IIDs."
print("Non-HLA-DQ SNP dosage data for the 2022 GRS includes 222 IIDs.")
[1] "Non-HLA-DQ SNP dosage data for the 2022 GRS includes 222 IIDs."

imputed.traw.GRSorig02

imputed.traw.GRSrevised02
imputed.traw.GRSorig03
imputed.traw.GRSrevised03

Output SNP dosage data to files

setwd(dir.Data)
Warning: The working directory was changed to /Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
fwrite(imputed.traw.GRSorig03, "MEGA_041822_Dosage_GRS2019_ImputedRef1000G3v5_excludingChr21snp_0.1_JRS.csv")
fwrite(imputed.traw.GRSorig03, "MEGA_041822_Dosage_GRS2019_ImputedRef1000G3v5_excludingChr21snp_0.1_JRS.tsv", sep = "\t")

setwd(dir.Data)
fwrite(imputed.traw.GRSrevised03, "MEGA_041822_Dosage_GRS2022_ImputedRef1000G3v5_excludingChr21snp_0.1_JRS.csv")
fwrite(imputed.traw.GRSrevised03, "MEGA_041822_Dosage_GRS2022_ImputedRef1000G3v5_excludingChr21snp_0.1_JRS.tsv")

ARCHIVE (NOT RUN)

Create a combined info file

cd '/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results/Results'
cat *.info.gz >> '/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/autosomesNoChr21.info.gz'
names(snp_list.split) #[1] "1"  "2"  "3"  "4"  "6"  "10" "11" "12" "14" "15" "16" "18" "22"
length(snp_list.split) #[1] 13

imputation.info.GRS.chr1 <- imputation.info$`1` %>% filter(SNP %in% snp_list.split$`1`$SNP)
imputation.info.GRS.chr2 <- imputation.info$`2` %>% filter(SNP %in% snp_list.split$`2`$SNP)
imputation.info.GRS.chr3 <- imputation.info$`3` %>% filter(SNP %in% snp_list.split$`3`$SNP)
imputation.info.GRS.chr4 <- imputation.info$`4` %>% filter(SNP %in% snp_list.split$`4`$SNP)
imputation.info.GRS.chr6 <- imputation.info$`6` %>% filter(SNP %in% snp_list.split$`6`$SNP)
imputation.info.GRS.chr10 <- imputation.info$`10` %>% filter(SNP %in% snp_list.split$`10`$SNP)
imputation.info.GRS.chr11 <- imputation.info$`11` %>% filter(SNP %in% snp_list.split$`11`$SNP)
imputation.info.GRS.chr12 <- imputation.info$`12` %>% filter(SNP %in% snp_list.split$`12`$SNP)
imputation.info.GRS.chr14 <- imputation.info$`14` %>% filter(SNP %in% snp_list.split$`14`$SNP)
imputation.info.GRS.chr15 <- imputation.info$`15` %>% filter(SNP %in% snp_list.split$`15`$SNP)
imputation.info.GRS.chr16 <- imputation.info$`16` %>% filter(SNP %in% snp_list.split$`16`$SNP)
imputation.info.GRS.chr18 <- imputation.info$`18` %>% filter(SNP %in% snp_list.split$`18`$SNP)
imputation.info.GRS.chr22 <- imputation.info$`22` %>% filter(SNP %in% snp_list.split$`22`$SNP)

imputation.info.GRS <- list(imputation.info.GRS.chr1,
     imputation.info.GRS.chr2,
     imputation.info.GRS.chr3,
     imputation.info.GRS.chr4,
     imputation.info.GRS.chr6,
     imputation.info.GRS.chr10,
     imputation.info.GRS.chr11,
     imputation.info.GRS.chr12,
     imputation.info.GRS.chr14,
     imputation.info.GRS.chr15,
     imputation.info.GRS.chr16,
     imputation.info.GRS.chr18,
     imputation.info.GRS.chr22) %>%
  lapply(as.data.frame) %>%
  rbindlist() %>%
  arrange(Rsq) %>%
  as.data.frame()

imputation.info.GRS %>% dim() #[1] 43 13

imputation.info.GRS

setwd(dir.Data)
fwrite(imputation.info.GRS, "MEGA_041822_Extracted_from_ImputedRef1000G3v5_NoChr21_v0.1_JRS.info.gz")
imputed.traw02 <- imputed.traw01 %>%
  left_join(imputationQCinfo.GRSorig, by = "CHR_POS") %>%
  rename(`INFO.REF(0)` = `REF(0)`,
         `INFO.ALT(1)` = `ALT(1)`,
         INFO.ALT_Frq = ALT_Frq,
         INFO.MAF = MAF,
         INFO.AvgCall = AvgCall,
         INFO.Rsq = Rsq,
         INFO.Genotyped = Genotyped,
         INFO.LooRsq = LooRsq,
         INFO.EmpR = EmpR,
         INFO.EmpRsq = EmpRsq,
         INFO.Dose0 = Dose0,
         INFO.Dose1 = Dose1)

imputed.traw02
originalGRS.nonHLADQ.dosage.INFO <- imputed.traw02 %>% filter(In_Original_GRS == 1) %>%
  select(-c(In_Original_GRS, In_Revised_GRS, Extracted)) %>%
  select(IID, CHR, POS, SNP, COUNTED, ALT, Dosage.COUNTED, everything()) %>%
  arrange(INFO.Rsq)

revisedGRS.dosage.INFO <- imputed.traw02 %>% filter(In_Revised_GRS == 1) %>%
  select(-c(In_Original_GRS, In_Revised_GRS, Extracted)) %>%
  select(IID, CHR, POS, SNP, COUNTED, ALT, Dosage.COUNTED, everything()) %>%
  arrange(INFO.Rsq)

originalGRS.nonHLADQ.INFO <- originalGRS.nonHLADQ.dosage.INFO %>% select(-c(IID, Dosage.COUNTED)) %>% unique()
revisedGRS.INFO <- revisedGRS.dosage.INFO %>% select(-c(IID, Dosage.COUNTED)) %>% unique()

originalGRS.nonHLADQ.dosage.INFO
revisedGRS.dosage.INFO

originalGRS.nonHLADQ.INFO
revisedGRS.INFO

Make a dataframe of the imputation quality statistics for the non-HLA-DQ SNPs in the originally-published GRS

INFO.nonHLADQ.origGRS <- anno.nonHLADQ.origGRS %>%
  filter(grepl("_", chrom)==FALSE) %>%
  select(name, chrom, chromEnd) %>%
  rename(GRS_rsID = name, CHR = chrom, POS = chromEnd) %>%
  as.data.frame() %>%
  mutate(CHR = as.character(CHR),
         CHR = gsub("chr", "", CHR),
         POS = as.character(POS)) %>%
  full_join(originalGRS.nonHLADQ.INFO %>%
              mutate(CHR = as.character(CHR), POS = as.character(POS)),
            by = c("CHR", "POS"))

INFO.nonHLADQ.origGRS

Make a dataframe of the imputation quality statistics for SNPs in the revised GRS

INFO.revisedGRS <- anno.revisedGRS %>%
  separate(POSITION_DBSNP151, into = c("CHR", "POS"), sep = ":", extra = "merge", remove = FALSE) %>%
  select(RSID, CHR, POS) %>%
  unique() %>%
  rename(GRS_rsID = RSID) %>%
  as.data.frame() %>%
  mutate(CHR = as.character(CHR),
         POS = as.character(POS)) %>%
  full_join(revisedGRS.INFO %>%
              mutate(CHR = as.character(CHR), POS = as.character(POS)),
            by = c("CHR", "POS"))

INFO.revisedGRS
INFO.nonHLADQ.origGRS
INFO.revisedGRS

setwd(dir.Data)
fwrite(INFO.nonHLADQ.origGRS, "MEGA_041812_ImputationINFO_OriginalGRS_nonHLADQsnps_v0.1_JRS.csv")
fwrite(INFO.revisedGRS, "MEGA_041812_ImputationINFO_RevisedGRS_v0.1_JRS.csv")

Setting and modifying theme for plots

theme_set(theme_gray(base_size = 12, base_family = "Arial") +
            theme(panel.border = element_rect(colour="black", fill = "transparent"),
                  plot.title = element_text(face="bold", hjust = 0), # lineheight=.8, size=20,
                  axis.text = element_text(color="black", size = 11), #size = 14
                  axis.text.x = element_text(angle = 0, hjust = NULL),
                  strip.background = element_rect(colour="black", fill = "light grey", size = 1), # adjusts facet label borders (if any)
                  panel.background = element_blank(),
                  panel.grid = element_blank()
          ))
RedBlue <- c("#CD3333", "#1874CD")
GrayBlue <- c("grey", "#2b8cbe")

Make INFO plot data

plotData.INFO.nonHLADQ.origGRS <- INFO.nonHLADQ.origGRS %>%
  select(GRS_rsID, SNP, INFO.Rsq, INFO.EmpRsq, INFO.MAF) %>%
  unique() %>%
  mutate(plotName = paste(GRS_rsID, " (", SNP, ")", sep = "")) %>%
  select(plotName, everything()) %>%
  mutate(INFO.Rsq = as.numeric(INFO.Rsq)) %>%
  arrange(INFO.Rsq) %>%
  # Filter out the GRS SNP located on Chromosome 21:
  filter(GRS_rsID != "rs1893592")

plotData.INFO.revisedGRS <- INFO.revisedGRS %>%
  select(GRS_rsID, SNP, INFO.Rsq, INFO.EmpRsq, INFO.MAF) %>%
  unique() %>%
  mutate(plotName = paste(GRS_rsID, " (", SNP, ")", sep = "")) %>%
  select(plotName, everything()) %>%
  mutate(INFO.Rsq = as.numeric(INFO.Rsq)) %>%
  arrange(INFO.Rsq) %>%
  # Filter out the GRS SNP located on Chromosome 21:
  filter(GRS_rsID != "rs1893592")

plotData.INFO.nonHLADQ.origGRS
plotData.INFO.revisedGRS

Make barplots of Rsq

plot.nonHLADQ.origGRS.Rsq <- plotData.INFO.nonHLADQ.origGRS %>%
  ggplot(aes(x = reorder(plotName, INFO.Rsq), y = INFO.Rsq)) +
  geom_bar(stat = "identity",
           #color = GrayBlue[[1]],
           fill = GrayBlue[[1]]) +
  coord_flip() +
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "dodgerblue3") +
  labs(title = "Estimated correlation of imputed genotypes and true, unobserved genotypes",
       subtitle = "Original GRS (2019), non-HLA-DQ SNPs only",
       caption = 'Rsq: "The estimated value of the squared correlation between imputed genotypes and true, unobserved genotypes"\n(https://genome.sph.umich.edu/wiki/Minimac3_Info_File).') +
  ylab("Rsq") +
  xlab("") +
  theme(plot.caption = element_text(hjust = 0),
        aspect.ratio = 0.9)

plot.revisedGRS.Rsq <- plotData.INFO.revisedGRS %>%
  ggplot(aes(x = reorder(plotName, INFO.Rsq), y = INFO.Rsq)) +
  geom_bar(stat = "identity",
           #color = GrayBlue[[1]],
           fill = GrayBlue[[1]]) +
  coord_flip() +
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "dodgerblue3") +
  labs(title = "Estimated correlation of imputed genotypes and true, unobserved genotypes",
       subtitle = "Revised GRS (2022)",
       caption = 'Rsq: "The estimated value of the squared correlation between imputed genotypes and true, unobserved genotypes"\n(https://genome.sph.umich.edu/wiki/Minimac3_Info_File).') +
  ylab("Rsq") +
  xlab("") +
  theme(plot.caption = element_text(hjust = 0),
        aspect.ratio = 0.9)

plot.nonHLADQ.origGRS.Rsq
plot.revisedGRS.Rsq

filename <- "MEGA_041822_Plot_Imputation_Rsq_OrigGRS_nonHLADQ_v0.1_JRS"
setwd(dir.Plots)
ggsave(plot = plot.nonHLADQ.origGRS.Rsq,
       filename = paste(filename, ".png", sep = ""), width = 10, height = 10, units = "in")
setwd(dir.Plots)
ggsave(plot = plot.nonHLADQ.origGRS.Rsq,
       filename = paste(filename, ".pdf", sep = ""), device = cairo_pdf, width = 10, height = 10, units = "in")

filename <- "MEGA_041822_Plot_Imputation_Rsq_RevisedGRS_v0.1_JRS"
setwd(dir.Plots)
ggsave(plot = plot.revisedGRS.RSQ,
       filename = paste(filename, ".png", sep = ""), width = 10, height = 10, units = "in")
setwd(dir.Plots)
ggsave(plot = plot.revisedGRS.RSQ,
       filename = paste(filename, ".pdf", sep = ""), device = cairo_pdf, width = 10, height = 10, units = "in")

Make barplots of empirical Rsq

plotData.INFO.nonHLADQ.origGRS %>% nrow()
plotData.INFO.nonHLADQ.origGRS %>% filter(INFO.EmpRsq != "-") %>% nrow()

plot.nonHLADQ.origGRS.EmpRsq <- plotData.INFO.nonHLADQ.origGRS %>%
  filter(INFO.EmpRsq != "-") %>%
  mutate(INFO.EmpRsq = as.numeric(INFO.EmpRsq)) %>%
  ggplot(aes(x = reorder(plotName, INFO.EmpRsq), y = INFO.EmpRsq)) +
  geom_bar(stat = "identity",
           #color = GrayBlue[[1]],
           fill = GrayBlue[[1]]) +
  coord_flip() +
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "dodgerblue3") +
  labs(title = "Estimated correlation of imputed genotypes and true, observed genotypes",
       subtitle = "Original GRS (2019), observed non-HLA-DQ SNPs only",
       caption = 'EmpRsq: The estimated squared correlation "between the true genotyped values and the imputed dosages that were calculated by hiding all known genotyped for the given SNP"\n(https://genome.sph.umich.edu/wiki/Minimac3_Info_File).') +
  ylab("EmpRsq") +
  xlab("") +
  theme(plot.caption = element_text(hjust = 0),
        aspect.ratio = 0.9)

plot.revisedGRS.EmpRsq <- plotData.INFO.revisedGRS %>%
  filter(INFO.EmpRsq != "-") %>%
  mutate(INFO.EmpRsq = as.numeric(INFO.EmpRsq)) %>%
  ggplot(aes(x = reorder(plotName, INFO.EmpRsq), y = INFO.EmpRsq)) +
  geom_bar(stat = "identity",
           #color = GrayBlue[[1]],
           fill = GrayBlue[[1]]) +
  coord_flip() +
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "dodgerblue3") +
  labs(title = "Estimated correlation of imputed genotypes and true, observed genotypes",
       subtitle = "Revised GRS (2022), observed SNPs only",
       caption = 'EmpRsq: The estimated squared correlation "between the true genotyped values and the imputed dosages that were calculated by hiding all known genotyped for the given SNP"\n(https://genome.sph.umich.edu/wiki/Minimac3_Info_File).') +
  ylab("EmpRsq") +
  xlab("") +
  theme(plot.caption = element_text(hjust = 0),
        aspect.ratio = 0.9)

plot.nonHLADQ.origGRS.EmpRsq
plot.revisedGRS.EmpRsq

filename <- "MEGA_041422_Plot_Imputation_EmpRsq_OrigGRS_nonHLADQ_v0.1_JRS"
setwd(dir.Plots)
ggsave(plot = plot.nonHLADQ.origGRS.EmpRsq,
       filename = paste(filename, ".png", sep = ""), width = 10, height = 10, units = "in")
setwd(dir.Plots)
ggsave(plot = plot.nonHLADQ.origGRS.EmpRsq,
       filename = paste(filename, ".pdf", sep = ""), device = cairo_pdf, width = 10, height = 10, units = "in")

filename <- "MEGA_041422_Plot_Imputation_EmpRsq_RevisedGRS_v0.1_JRS"
setwd(dir.Plots)
ggsave(plot = plot.revisedGRS.EmpRsq,
       filename = paste(filename, ".png", sep = ""), width = 10, height = 10, units = "in")
setwd(dir.Plots)
ggsave(plot = plot.revisedGRS.EmpRsq,
       filename = paste(filename, ".pdf", sep = ""), device = cairo_pdf, width = 10, height = 10, units = "in")

Make a simple text file that lists all of the GRS rsIDs

grs_rsIDs.orig <- rbind(sharpS1 %>%
                          select(`HLA-DQ.haplotype`, SNP1, SNP2) %>%
                          rename(HLA_DQ_haplotype = `HLA-DQ.haplotype`) %>%
                          gather(key = "key", value = "value", SNP1:SNP2) %>%
                          mutate(SNP_index = gsub("SNP", "", key) %>% as.numeric()) %>%
                          rename(GRS_rsID = value) %>%
                          select(HLA_DQ_haplotype, SNP_index, GRS_rsID) %>%
                          arrange(HLA_DQ_haplotype) %>%
                          select(GRS_rsID),
                        anno.nonHLADQ.origGRS %>% select(name) %>% rename(GRS_rsID = name) %>% as.data.frame()) %>%
  unique()

grs_rsIDs.revised <- anno.revisedGRS %>%
  select(RSID) %>%
  rename(GRS_rsID = RSID) %>%
  unique()

grs_rsIDs.orig_revised <- rbind(grs_rsIDs.orig, grs_rsIDs.revised) %>%
  unique()

grs_rsIDs.orig
grs_rsIDs.revised
grs_rsIDs.orig_revised

setwd(dir.Data)
fwrite(grs_rsIDs.orig_revised, "MEGA_041822_rsIDs_GRSoriginal_GRSrevised_v0.1_JRS.txt", sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE)
fwrite(grs_rsIDs.orig, "MEGA_041822_rsIDs_GRSoriginal_v0.1_JRS.txt", sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE)
fwrite(grs_rsIDs.revised, "MEGA_041822_rsIDs_GRSrevised_v0.1_JRS.txt", sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE)
grs_rsIDs.orig$GRS_rsID %>% paste(collapse = ",")
grs_rsIDs.revised$GRS_rsID %>% paste(collapse = ",")

Use the strings produced above to search GRASP and HaploReg

https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php https://grasp.nhlbi.nih.gov/Search.aspx

query.GRSorig <- c("rs1049124","rs7775228","rs2187668","rs1617322","rs73405471","rs79550239","rs7454108","rs3957146","rs10800746","rs12068671","rs12142280",
                   "rs1359062","rs4445406","rs10167650","rs1018326","rs13003464","rs1980422","rs6715106","rs990171","rs1353248","rs2030519","rs2561288",
                   "rs61579022","rs7616215","rs13132308","rs1050976","rs1611710","rs17264332","rs182429","rs2301226","rs3128927","rs4143332","rs55743914",
                   "rs6937061","rs1250552","rs2387397","rs10892258","rs61907765","rs7104791","rs3184504","rs11851414","rs1378938","rs6498114","rs11875687",
                   "rs1893592","rs4821124")

query.GRSrevised <- c("rs1049124","rs2187668","rs73405471","rs9275437","rs4143332","rs3128927","rs2301226","rs6937061","rs1611710","rs13132308","rs2030519",
                      "rs1323292","rs17264332","rs6715106","rs55743914","rs990171","rs1980422","rs3184504","rs61907765","rs13003464","rs11875687","rs12068671",
                      "rs1250552","rs10892258","rs1018326","rs182429","rs7104791","rs4821124","rs4445406","rs11801183","rs6498114","rs1353248","rs947474",
                      "rs1893592","rs11851414","rs1378938","rs10800746","rs1050976","rs7616215","rs2561288","rs61579022","rs10167650")
query.GRSorig
query.GRSrevised

#install.packages("haploR", dependencies = TRUE)
library(haploR)
queryHaploReg.GRSorig <- queryHaploreg(query = query.GRSorig, url = "https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php")
queryHaploReg.GRSrevised <- queryHaploreg(query = query.GRSrevised, url = "https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php")
queryHaploReg.GRSorig
queryHaploReg.GRSrevised

setwd(dir.GRSanno)
fwrite(queryHaploReg.GRSorig, "041422_HaploReg_GRSoriginal_v0.1_JRS.txt")
fwrite(queryHaploReg.GRSrevised, "041422_HaploReg_GRSrevised_v0.1_JRS.txt")
pwd
wget 'https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php'

library(XML)
library(httr)

theurl <- 'https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php'
doc <- htmlParse(GET(theurl, user_agent("Chrome")))
results <- xpathSApply(doc, "//*/table[@id='table_results_r_1']")
results <- readHTMLTable(results[[1]])
rm(doc)


library(XML)
library(RCurl)
library(rlist)
theurl <- getURL("https://pubs.broadinstitute.org/mammals/haploreg/haploreg.php",.opts = list(ssl.verifypeer = FALSE) )
tables <- readHTMLTable(theurl)
tables <- list.clean(tables, fun = is.null, recursive = FALSE)
n.rows <- unlist(lapply(tables, function(t) dim(t)[1]))

tables
setwd("/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation")
haploreg.GRSorig<- fread("041422_HaploReg_GRSoriginal_v0.1_JRS.txt", fill = TRUE)
haploreg.GRSrevised <- fread("041422_HaploReg_GRSrevised_v0.1_JRS.txt", fill = TRUE)
GRASP.GRSorig <- read.xlsx("041422_GRASPsearch_GRSoriginal_v0.1_JRS.xlsx")
GRASP.GRSrevised <- read.xlsx("041422_GRASPsearch_GRSrevised_v0.1_JRS.xlsx")

test <- fread("/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Annotation/041422_HaploReg_GRSoriginal_DQB1_v0.1_JRS.txt", sep = "\t", fill = TRUE)
test

haploreg.GRSorig
haploreg.GRSrevised
GRASP.GRSorig
GRASP.GRSrevised

ARCHIVE

plotData.INFO.revisedGRS %>%
  filter(INFO.EmpRsq != "-")


names(imputation.info)[[1]]
imputation.info[[1]]

names(snp_list.split)[[1]]
snp_list.split[[1]]

names(snp_list.split) %>% length()
imputation.info %>% length()

#imputation.info.GRS <- list()
#for ( i in 1:c(seq(1:20),22)) {
  #imputation.info.GRS[[i]] <- imputation.info$`1` %>% filter(SNP %in% snp_list.split$`1`$SNP)

snp_list.split %>% names() %>% paste(collapse = ",")

temp <- c(1,2,3,4,6,10,11,12,14,15,16,18,22)



imputation.info.GRS[[1]] <- imputation.info$`1` %>% filter(SNP %in% snp_list.split$`1`$SNP)



temp <- c(1,2,3,4,6,10,11,12,14,15,16,18,22)
imputation.info.GRS <- list()
for ( i in length(temp)) {
  
  chr.now <- temp[[i]]
  
  imputation.info.GRS[[i]] <- imputation.info[[chr.now]] %>% filter(SNP %in% snp_list.split[[chr.now]]$SNP)
}

imputation.info.GRS %>% rbindlist() %>% dim()

imputation.info.GRS %>% lapply(as.data.frame) %>% lapply(dim)
setwd(dir.Data)
info.GRSsnps <- fread("/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/autosomesNoChr21.info.gz", sep = "\t")

info.GRSsnps
info <- fread("/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/autosomesNoChr21.info.gz")

info

Make a text file listing the variant IDs for the GRS SNPs in the original GRS and the revised GRS

to_grep <- imputed.traw01 %>% select(SNP) %>% unique()

setwd(dir.Data)
fwrite(to_grep, "MEGA_041822_Imputed_VariantIDs_OrigGRS_RevisedGRS_v0.1_JRS.txt", sep = "\t", row.names = FALSE, col.names = FALSE, quote = FALSE)

Search the info file and filter it to the variant IDs representing SNPs that are in the original or revised GRS

cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
zcat < '/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/autosomesNoChr21.info.gz' | awk 'NR==FNR{_[$1];next}!($1 in _)' 'MEGA_041822_Imputed_VariantIDs_OrigGRS_RevisedGRS_v0.1_JRS.txt' - > 'MEGA_041822_SNPs_OrigGRS_RevisedGRS_v0.1_JRS.info.txt'
cd '/Users/shawjes/Dropbox/EspinosaGroup/ANALYSIS/Celiac_MultiOmics/GRS/DSMIG_Shared/Manuscript_Figure1/Data'
zcat < '/Users/shawjes/Dropbox/EspinosaGroup/DATA_MAIN/MEGA/Imputation_Ref1000G3v5/Out/Imputation_Results_CLEAN/autosomesNoChr21.info.gz' | grep -f 'MEGA_041822_Imputed_VariantIDs_OrigGRS_RevisedGRS_v0.1_JRS.txt' > 'MEGA_041822_SNPs_OrigGRS_RevisedGRS_v0.1_JRS.info'
setwd(dir.Data)
GRSsnps.info <- fread("MEGA_041822_SNPs_OrigGRS_RevisedGRS_v0.1_JRS.info")

GRSsnps.info
setwd(dir.ImputationResultsRAW)
imputation.info <- list.files(pattern = "info") %>%
  lapply(fread) %>%
  rbindlist()

imputation.info

Code reference: https://stackoverflow.com/questions/19380925/grep-a-large-list-against-a-large-file grep -f the_ids.txt huge.csv -F, –fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)

          
          
imputed.dosage.OrigGRS.nonHLADQ %>%
  select(-c(IID, Dosage.COUNTED)) %>%
  unique() %>%
  select(SNP) %>%
  left_join(imputation.info, by = "SNP")

imputed.dosage.RevisedGRS %>%
  select(-c(IID, Dosage.COUNTED)) %>%
  unique() %>%
  select(SNP)

imputation.info
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIyBGT0xMT1ctVVA6IEFkZCBpbnRybyBzZWN0aW9uCgojIyMjIExvYWQgZnJlcXVlbnRseSB1c2VkIHBhY2thZ2VzCmBgYHtyfQojbGlicmFyeShkdHBseXIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc2tpbXIpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGJyb29tRXh0cmEpCmxpYnJhcnkodGliYmxlKQpsaWJyYXJ5KHNqc3RhdHMpCmxpYnJhcnkoY2FyKQojbGlicmFyeShsbWU0KQojbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShtb2RlbHIpCmxpYnJhcnkodGlkeXZlcnNlKQojbGlicmFyeShtaWNlYWRkcykKbGlicmFyeShnZ2ZvcmNlKQpyZXF1aXJlKG9wZW54bHN4KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjYXJldCkKI2xpYnJhcnkoZ2xtbmV0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KE1BU1MpICMgcmxtCmxpYnJhcnkobG1QZXJtKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShDb21wbGV4SGVhdG1hcCkKCnNlbGVjdCA8LSBkcGx5cjo6c2VsZWN0CmZpbHRlciA8LSBkcGx5cjo6ZmlsdGVyCmAlbm90aW4lYCA8LSBOZWdhdGUoYCVpbiVgKQpgYGAKCiMjIyMgUHJpbnQgc2Vzc2lvbiBpbmZvIGZvciByZXByb2R1Y2liaWxpdHkKYGBge3J9CnNhdmUuU2Vzc2lvbkluZm8gPC0gc2Vzc2lvbkluZm8oKQpzYXZlLlNlc3Npb25JbmZvCmBgYAoKIyMjIyBTdG9yZSBJbiBhbmQgT3V0IGRpcmVjdG9yeSBsb2NhdGlvbnMgdG8gUiBvYmplY3RzCmBgYHtyfQojc2V0d2QoJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHNfQ0xFQU4nKQpkaXIuSW1wdXRhdGlvblJlc3VsdHNSQVcgPC0gIi9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHMvUmVzdWx0cyIKZGlyLkltcHV0YXRpb25SZXN1bHRzQ0xFQU4gPC0gIi9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHNfQ0xFQU4iCmRpci5JbXB1dGF0aW9uUmVzdWx0cy5RQ3N0YXRzIDwtICIvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvREFUQV9NQUlOL01FR0EvSW1wdXRhdGlvbl9SZWYxMDAwRzN2NS9PdXQvSW1wdXRhdGlvbl9SZXN1bHRzL1FDX1N0YXRpc3RpY3MiCmRpci5EYXRhIDwtICIvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YSIKZGlyLlBsb3RzIDwtICIvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvUGxvdHMiCmRpci5HUlNvcmlnaW5hbC5Bbm5vIDwtICIvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvQW5ub3RhdGlvbi9HUlNvcmlnaW5hbCIKZGlyLkdSU3JldmlzZWQuQW5ubyA8LSAiL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0Fubm90YXRpb24vR1JTcmV2aXNlZCIKYGBgCgojIyMjIENvcHkgdGhlIGltcHV0ZWQgVkNGIGFuZCBpbmRleCBmaWxlIHRvIHRoZSBtYW51c2NyaXB0IGRhdGEgZGlyZWN0b3J5CmBgYHtiYXNofQojY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHNfQ0xFQU4nCiNjcCAtYSAnTUVHQV8wNDExMjJfRXNwaW5vc2EwODEzMjAxOVFDcGFzc19JTVBVVEVEd2l0aFBoYXNpbmdfcmVmMTAwMEczdjVfYXV0b3NvbWVzTm9DaHIyMV92MC4xX0pSUy52Y2YuZ3onICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YS8nCgojY3AgLWEgJ01FR0FfMDQxMTIyX0VzcGlub3NhMDgxMzIwMTlRQ3Bhc3NfSU1QVVRFRHdpdGhQaGFzaW5nX3JlZjEwMDBHM3Y1X2F1dG9zb21lc05vQ2hyMjFfdjAuMV9KUlMudmNmLmd6LmNzaScgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9EYXRhLycKCiNjcCAtYSAnYXV0b3NvbWVzTm9DaHIyMS5pbmZvLmd6JyAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0RhdGEvJwpgYGAKCiMjIyMgVmlldyB0aGUgVkNGIGhlYWRlciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSBWQ0YgZGF0YSBzZWN0aW9uCmBgYHtiYXNofQpjZCAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0RhdGEvJwp6Y2F0IDwgJ01FR0FfMDQxMTIyX0VzcGlub3NhMDgxMzIwMTlRQ3Bhc3NfSU1QVVRFRHdpdGhQaGFzaW5nX3JlZjEwMDBHM3Y1X2F1dG9zb21lc05vQ2hyMjFfdjAuMV9KUlMudmNmLmd6JyB8IGhlYWQgLW4gNDQKYGBgCgojIyMjIFJlYWQgaW4gU2hhcnAgZXQgYWwuLCAyMDE5IHN1cHBsZW1lbnRhbCB0YWJsZXMgYW5kIG9yZ2FuaXplIGEgbGlzdCBvZiBTTlBzIGluIHRoZSBvcmlnaW5hbGx5LXB1Ymxpc2hlZCBHUlMKYGBge3J9CnNldHdkKGRpci5HUlNvcmlnaW5hbC5Bbm5vKQpzaGFycFMxIDwtIHJlYWQueGxzeCgiYXB0MTU4MjYtc3VwLTAwMDEtc3VwaW5mby54bHN4Iiwgc2hlZXQgPSAiVGFibGUgUzEiLCBzdGFydFJvdyA9IDMpCnNoYXJwUzIgPC0gcmVhZC54bHN4KCJhcHQxNTgyNi1zdXAtMDAwMS1zdXBpbmZvLnhsc3giLCBzaGVldCA9ICJUYWJsZSBTMiIsIHN0YXJ0Um93ID0gMykKc2hhcnBTMyA8LSByZWFkLnhsc3goImFwdDE1ODI2LXN1cC0wMDAxLXN1cGluZm8ueGxzeCIsIHNoZWV0ID0gIlRhYmxlIFMzIiwgc3RhcnRSb3cgPSAzKQoKc2hhcnBTMQpzaGFycFMyCnNoYXJwUzMKCnJzSURzLkdSU29yaWcgPC0gcmJpbmQoCiAgYyhzaGFycFMxJFNOUDEsIHNoYXJwUzEkU05QMikgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgYGNvbG5hbWVzPC1gKCJHUlNfcnNJRCIpLAogIHNoYXJwUzMgJT4lIHNlbGVjdChTTlApICU+JSByZW5hbWUoR1JTX3JzSUQgPSBTTlApICkKCnJzSURzLkdSU29yaWcKYGBgCgojIyMjIERvd25sb2FkIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGZvciB0aGUgcmV2aXNlZCBDRCBHUlMKaHR0cHM6Ly9naXRodWIuY29tL3NldGhzaDcvaGxhLXBycy10b29sa2l0CmBgYHtiYXNofQojIFJhdyBsaW5rOiBodHRwczovL3Jhdy5naXRodWIuY29tLzx1c2VybmFtZT4vPHJlcG8+LzxicmFuY2g+L0V4Y2VsZmlsZS54bHN4CgojY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9Bbm5vdGF0aW9uL0dSU3JldmlzZWQnCiN3Z2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXRoc2g3L2hsYS1wcnMtdG9vbGtpdC9yYXcvbWFpbi9Ub29scy9TbnBsaXN0cy9DRF9HUlM0Mi9DRF9HUlM0Ml8xMDAwR19ub3BhbGluX3Bvc19oZzE5Lnhsc3gKCiN3Z2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXRoc2g3L2hsYS1wcnMtdG9vbGtpdC9yYXcvbWFpbi9Ub29scy9TbnBsaXN0cy9DRF9HUlM0Mi9tYXBwaW5nXzEwMDBHLnR4dAoKI3dnZXQgaHR0cHM6Ly9naXRodWIuY29tL3NldGhzaDcvaGxhLXBycy10b29sa2l0L3Jhdy9tYWluL1Rvb2xzL1NucGxpc3RzL0NEX0dSUzQyL21hcHBpbmdfSFJDX1RPUE1FRC50eHQKCiN3Z2V0IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXRoc2g3L2hsYS1wcnMtdG9vbGtpdC9yYXcvbWFpbi9Ub29scy9TbnBsaXN0cy9DRF9HUlM0Mi9zY29yZWZpbGUudHh0CmBgYAoKIyMjIyBSZWFkIGluIHdvcmtib29rIG9mIGFubm90YXRpb24gZm9yIFNOUHMgaW4gdGhlIHJldmlzZWQgR1JTICgyMDIyKSBhbmQgcHJlcGFyZSBhIGRhdGFmcmFtZSBvZiB0aGUgU05QIHJzSURzLCBjaHJvbW9zb21lIGFuZCBiYXNlLXBhaXIgbG9jYXRpb25zCmBgYHtyfQpzZXR3ZChkaXIuR1JTcmV2aXNlZC5Bbm5vKQpHUlMucmV2aXNlZCA8LSByZWFkLnhsc3goIkNEX0dSUzQyXzEwMDBHX25vcGFsaW5fcG9zX2hnMTkueGxzeCIpCgpHUlMucmV2aXNlZAoKcnNJRHMuR1JTcmV2aXNlZCA8LSBHUlMucmV2aXNlZCAlPiUKICBzZWxlY3QoUlNJRCwgUE9TSVRJT05fREJTTlAxNTEpICU+JQogIHJlbmFtZShHUlNfcnNJRCA9IFJTSUQpICU+JQogIHNlcGFyYXRlKFBPU0lUSU9OX0RCU05QMTUxLCBpbnRvID0gYygiQ0hSIiwgIkJQIiksIHNlcCA9ICI6IiwgZXh0cmEgPSAibWVyZ2UiLCByZW1vdmUgPSBUUlVFKQoKcnNJRHMuR1JTcmV2aXNlZApgYGAKCiMjIyMgT3V0cHV0IGEgbGlzdCBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBHUlMgdG8gaW5wdXQgdG8gdGhlIFVDU0MgVGFibGUgQnJvd3NlcgpodHRwczovL2dlbm9tZS51Y3NjLmVkdS9jZ2ktYmluL2hnVGFibGVzCmBgYHtyfQpyc0lEbGlzdC5HUlNvcmlnIDwtIHJzSURzLkdSU29yaWcgJT4lIHNlbGVjdChHUlNfcnNJRCkKcnNJRGxpc3QuR1JTcmV2aXNlZCA8LSByc0lEcy5HUlNyZXZpc2VkICU+JSBzZWxlY3QoR1JTX3JzSUQpCgpyc0lEbGlzdC5HUlNvcmlnCnJzSURsaXN0LkdSU3JldmlzZWQKCnNldHdkKGRpci5EYXRhKQpmd3JpdGUocnNJRGxpc3QuR1JTb3JpZywgIk1FR0FfMDQxODIyX0dSU29yaWdpbmFsX3JzSURfbGlzdF92MC4xX0pSUy50eHQiLAogICAgICAgc2VwID0gIlx0IiwgcXVvdGUgPSBGQUxTRSwgY29sLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFKQpmd3JpdGUocnNJRGxpc3QuR1JTcmV2aXNlZCwgIk1FR0FfMDQxODIyX0dSU3JldmlzZWRfcnNJRF9saXN0X3YwLjFfSlJTLnR4dCIsCiAgICAgICBzZXAgPSAiXHQiLCBxdW90ZSA9IEZBTFNFLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyMjIyMgVXBsb2FkIHRoZSBmaWxlcyBwcm9kdWNlZCBhYm92ZSB0byB0aGUgSGcgVGFibGVzIHNpdGUgKGh0dHBzOi8vZ2Vub21lLnVjc2MuZWR1L2NnaS1iaW4vaGdUYWJsZXMpLCBkb3dubG9hZCB0aGUgcmVzdWx0cywgdGhlbiBtb3ZlIHRoZW0gaW50byB0aGUgbWFudXNjcmlwdCBkYXRhIGZvbGRlcgpgYGB7YmFzaH0KI2NwIC1hICcvVXNlcnMvc2hhd2plcy9Eb3dubG9hZHMvTUVHQV8wNDE4MjJfQW5ub3RhdGlvbl9HUmgzN19HUlNvcmlnaW5hbF9yc0lEX2xpc3RfdjAuMV9KUlMuY3N2JyAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0Fubm90YXRpb24vR1JTb3JpZ2luYWwnCgojY3AgLWEgJy9Vc2Vycy9zaGF3amVzL0Rvd25sb2Fkcy9NRUdBXzA0MTgyMl9Bbm5vdGF0aW9uX0dSaDM3X0dSU3JldmlzZWRfcnNJRF9saXN0X3YwLjFfSlJTLmNzdicgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9Bbm5vdGF0aW9uL0dSU3JldmlzZWQnCmBgYAoKIyMjIyBSZW1vdmUgdGhlICMgaW4gdGhlIGZpcnN0IGNvbHVtbiBuYW1lIG9mIHRoZSBkb3dubG9hZGVkIGFubm90YXRpb24gZGF0YQpodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMjAwNDk1MC9ob3ctdG8tcmVwbGFjZS1zdHJpbmctaW4tYS1maWxlLWluLXBsYWNlLXVzaW5nLXNlZApgYGB7YmFzaH0KI2NkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvQW5ub3RhdGlvbi9HUlNvcmlnaW5hbCcKI3NlZCAtaSAnJyAncy9cIy8vZycgJ01FR0FfMDQxODIyX0Fubm90YXRpb25fR1JoMzdfR1JTb3JpZ2luYWxfcnNJRF9saXN0X3YwLjFfSlJTLmNzdicKCiNjZCAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0Fubm90YXRpb24vR1JTcmV2aXNlZCcKI3NlZCAtaSAnJyAncy9cIy8vZycgJ01FR0FfMDQxODIyX0Fubm90YXRpb25fR1JoMzdfR1JTcmV2aXNlZF9yc0lEX2xpc3RfdjAuMV9KUlMuY3N2JwpgYGAKCiMjIyMgUmVhZCBpbiB0aGUgYW5ub3RhdGlvbiBkYXRhIGNvbGxlY3RlZCB2aWEgdGhlIFVDU0MgVGFibGUgQnJvd3NlciBhbmQgcHJlcGFyZSBmaWxlcyBmb3IgdXNlIHdpdGggQkNGdG9vbHMgLS1yZWdpb25zCmBgYHtyfQpzZXR3ZChkaXIuR1JTb3JpZ2luYWwuQW5ubykKR1JDaDM3LkdSU29yaWcgPC0gZnJlYWQoIk1FR0FfMDQxODIyX0Fubm90YXRpb25fR1JoMzdfR1JTb3JpZ2luYWxfcnNJRF9saXN0X3YwLjFfSlJTLmNzdiIpICU+JQogIHJlbmFtZShHUlNfcnNJRCA9IG5hbWUsIENociA9IGNocm9tLCBCUCA9IGNocm9tRW5kKSAlPiUKICBzZWxlY3QoR1JTX3JzSUQsIENociwgQlApICU+JSAgIyBOb3RlOiBJIGhhdmUgcHJldmlvdXNseSBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBNRUdBICouYmltIGZpbGUgbWF0Y2ggdXAgd2l0aCB0aGUgY2hyb21FbmQgY29sdW1uIGV4cG9ydGVkIGZyb20gdGhlIFRhYmxlIEJyb3dzZXIsIGF0IGxlYXN0IGZvciB0aGUgU05QcyBpbiB0aGlzIEdSUy4KICBmaWx0ZXIoZ3JlcGwoIl8iLCBDaHIpPT1GQUxTRSkgJT4lICMgTm90ZTogSSBoYXZlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5ncyBmb3IgdGhlIEhMQSByZWdpb24gU05QcyAoZS5nLiwgJ2NocjZfc3N0b19oYXA3JyBvciAnY2hyNl9xYmxfaGFwNicpLCBzbyB3ZSB3aWxsIGV4Y2x1ZGUgdGhvc2Ugcm93cyBmcm9tIHRoZSBkYXRhZnJhbWUKICBtdXRhdGUoQ2hyID0gZ3N1YigiY2hyIiwgIiIsIENocikgJT4lIGFzLm51bWVyaWMoKSkKCnNldHdkKGRpci5HUlNyZXZpc2VkLkFubm8pCkdSQ2gzNy5HUlNyZXZpc2VkIDwtIGZyZWFkKCJNRUdBXzA0MTgyMl9Bbm5vdGF0aW9uX0dSaDM3X0dSU3JldmlzZWRfcnNJRF9saXN0X3YwLjFfSlJTLmNzdiIpICU+JQogIHJlbmFtZShHUlNfcnNJRCA9IG5hbWUsIENociA9IGNocm9tLCBCUCA9IGNocm9tRW5kKSAlPiUKICBzZWxlY3QoR1JTX3JzSUQsIENociwgQlApICU+JSAgIyBOb3RlOiBJIGhhdmUgcHJldmlvdXNseSBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBNRUdBICouYmltIGZpbGUgbWF0Y2ggdXAgd2l0aCB0aGUgY2hyb21FbmQgY29sdW1uIGV4cG9ydGVkIGZyb20gdGhlIFRhYmxlIEJyb3dzZXIsIGF0IGxlYXN0IGZvciB0aGUgU05QcyBpbiB0aGlzIEdSUy4KICBmaWx0ZXIoZ3JlcGwoIl8iLCBDaHIpPT1GQUxTRSkgJT4lICMgTm90ZTogSSBoYXZlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBhbHRlcm5hdGl2ZSBtYXBwaW5ncyBmb3IgdGhlIEhMQSByZWdpb24gU05QcyAoZS5nLiwgJ2NocjZfc3N0b19oYXA3JyBvciAnY2hyNl9xYmxfaGFwNicpLCBzbyB3ZSB3aWxsIGV4Y2x1ZGUgdGhvc2Ugcm93cyBmcm9tIHRoZSBkYXRhZnJhbWUKICBtdXRhdGUoQ2hyID0gZ3N1YigiY2hyIiwgIiIsIENocikgJT4lIGFzLm51bWVyaWMoKSkKCkdSQ2gzNy5HUlNvcmlnCkdSQ2gzNy5HUlNyZXZpc2VkCmBgYAoKIyMjIyBWZXJpZnkgdGhlIG1hcHBpbmcgb2YgdGhlIFNOUHMgaW4gdGhlIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIHRoZSByZXZpc2VkIEdSUwpgYGB7cn0Kc2V0d2QoZGlyLkdSU3JldmlzZWQuQW5ubykKYW5uby5yZXZpc2VkR1JTIDwtIHJlYWQueGxzeCgiQ0RfR1JTNDJfMTAwMEdfbm9wYWxpbl9wb3NfaGcxOS54bHN4IikKCmFubm8ucmV2aXNlZEdSUyAlPiUKICBzZWxlY3QoUlNJRCwgUE9TSVRJT05fREJTTlAxNTEpICU+JQogIHNlcGFyYXRlKFBPU0lUSU9OX0RCU05QMTUxLCBpbnRvID0gYygiQ2hyIiwgIkJQIiksIHNlcCA9ICI6IikgJT4lCiAgcmVuYW1lKEdSU19yc0lEID0gUlNJRCkgJT4lCiAgZnVsbF9qb2luKEdSQ2gzNy5HUlNyZXZpc2VkLCBieSA9ICJHUlNfcnNJRCIpICU+JQogIGZpbHRlcihDaHIueCAhPSBDaHIueSB8IEJQLnggIT0gQlAueSkKIyAwIHJvd3MgPSBhbGwgZ29vZC4KYGBgCgojIyMjIENyZWF0ZSBhIGRhdGFmcmFtZSBvZiB0aGUgbG9jYXRpb25zIG9mIHRoZSBTTlBzIGluIHRoZSBvcmlnaW5hbCBHUlMgYW5kIHRoZSByZXZpc2VkIEdSUwpgYGB7cn0KdG9fZXh0cmFjdCA8LSByYmluZChHUkNoMzcuR1JTb3JpZyAlPiUKICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShHUlNfdmVyc2lvbiA9ICJPcmlnaW5hbCIpLAogICAgICAgICAgICAgICAgICAgIEdSQ2gzNy5HUlNyZXZpc2VkICU+JQogICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKEdSU192ZXJzaW9uID0gIlJldmlzZWQiKSkgJT4lCiAgbXV0YXRlKENIUl9CUCA9IHBhc3RlKENociwgQlAsIHNlcCA9ICI6IikpICU+JQogIGFycmFuZ2UoQ0hSX0JQKSAlPiUKICBtdXRhdGUoSW5kaWNhdG9yID0gMSkgJT4lCiAgc3ByZWFkKGtleSA9IEdSU192ZXJzaW9uLCB2YWx1ZSA9IEluZGljYXRvcikgJT4lCiAgcmVuYW1lKEluX09yaWdpbmFsX0dSUyA9IE9yaWdpbmFsLAogICAgICAgICBJbl9SZXZpc2VkX0dSUyA9IFJldmlzZWQpICU+JQogIG11dGF0ZShJbl9PcmlnaW5hbF9HUlMgPSBpZmVsc2UoaXMubmEoSW5fT3JpZ2luYWxfR1JTKSwgMCwgSW5fT3JpZ2luYWxfR1JTKSwKICAgICAgICAgSW5fUmV2aXNlZF9HUlMgPSBpZmVsc2UoaXMubmEoSW5fUmV2aXNlZF9HUlMpLCAwLCBJbl9SZXZpc2VkX0dSUykpCgp0b19leHRyYWN0CmBgYAoKIyMjIyBGT0xMT1cgVVAKIyMjIyBDb21wYXJlIHRoZSBtYXBwaW5nIG9mIHRoZSBvcmlnaW5hbCBHUlMgU05QcyB0byB0aGVpciByZXBsYWNlbWVudCBTTlBzIHRvIGFzc2VzcyBpZiB0aGUgcHV0YXRpdmUgZ2VuZSBpcyBsaWtlbHkgdGhlIHNhbWUKRm9sbG93LXVwIGVtYWlsIHRvIFNoYXJwIHRlYW0gdG8gY29uZmlybSB0aGF0IHB1dGF0aXZlIGdlbmVzIGFyZSBhc3N1bWVkIHRvIHN0aWxsIGJlIHRoZSBzYW1lIGluIHRoZSByZXZpc2VkIEdSUyAodGhpcyB3aWxsIGltcGFjdCBOZWV0aGEncyBtdWx0aS1vbWljcyBmaWd1cmVzKQpgYGB7cn0KCiMgRk9MTE9XLVVQCiMgVXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGhvdyBmYXIgYXBhcnQgdGhlIG9yaWdpbmFsIHZzLiByZXBsYWNlbWVudCBTTlBzIGFyZSBmcm9tIG9uZSBhbm90aGVyLgoKdG9fZXh0cmFjdAoKYGBgCgojIyMjIEdldCBhIGxvbmcgc3RyaW5nIG9mIHRoZSBsb2NhdGlvbnMgb2YgR1JTIFNOUHMgc2VwYXJhdGVkIGJ5IGNvbW1hcwooVmlldyB0aGUgY29uc29sZSB0byBjb3B5IHRoZSBmdWxsIHN0cmluZykKYGBge3J9CnRvX2V4dHJhY3QkQ0hSX0JQICU+JQogIHBhc3RlKGNvbGxhcHNlID0gIiwiKQpgYGAKCiMjIyMgVXNlIGJjZnRvb2xzIHZpZXcgd2l0aCB0aGUgc3RyaW5nIHByb2R1Y2VkIGFib3ZlIHRvIGV4dHJhY3QgdGhlIEdSUyBTTlBzIGZyb20gdGhlIGltcHV0ZWQgTUVHQSBkYXRhCmBgYHtiYXNofQojIGh0dHBzOi8vc2FtdG9vbHMuZ2l0aHViLmlvL2JjZnRvb2xzL2JjZnRvb2xzLmh0bWwKIyBiY2Z0b29scyAtciwgLS1yZWdpb25zIGNocnxjaHI6cG9zfGNocjpmcm9tLXRvfGNocjpmcm9tLVss4oCm4oCLXQoKY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9EYXRhJwpiY2Z0b29scyB2aWV3IFwKLS1yZWdpb25zIFwKMjo2ODY0NTU2MCwyOjE4MjAwNzgwMCw2OjMyNjI3NzEzLDY6NDA4MDc5LDE6MjAwODgxMzkyLDExOjExODU3OTg2NSwxOjE3Mjg2Mjk4NCwxNDo2OTI1OTUwMiwxODoxMjg0MzEzNywxOjE3MjY4MTAzMSwxOjE3Mjg2NDY1MiwxMDo4MTA1ODAyNywyOjYxMTg2ODI5LDQ6MTIzNTUxMTE0LDE6MTkyNTQxMDIxLDM6MTU5NjIzNTU5LDE6MTkyNTQxNDcyLDE1Ojc1MDk2NDQzLDY6Mjk4Mjg5MTYsNjozMjY3Mzg5Myw2OjEzODAwNTUxNSw2OjE1OTQ2OTU3NCwyMTo0Mzg1NTA2NywyOjIwNDYxMDM5NiwzOjE4ODExOTkwMSw2OjMyNjA1ODg0LDY6MzMwMzQ1OTYsMTA6NjM5MDE5MiwzOjE1OTY3NDkyOCw2OjMzMDc0Mjg4LDEyOjExMTg4NDYwOCw2OjMyNjgxNTMwLDY6MzEzNDgzNjUsMToyNTM5NDAwLDIyOjIxOTc5Mjg5LDY6MTI4MjkzNTYyLDM6MTE5MTIzMjc4LDExOjEyODM5MTkzNywxNjoxMDk2NDExOCwyOjE5MTkxMzAzNCw2OjMzMDc5ODEyLDExOjExMTE5Njg1OCw2OjMyNjAzMzc0LDM6NDYyMDU2ODYsNjozMjY1ODA3OSw2OjMyNjIwNjI4LDY6MzI2NzE0MTIsMTA6NjM5MDQ1MCwyOjEwMzA4Njc3MCBcCidNRUdBXzA0MTEyMl9Fc3Bpbm9zYTA4MTMyMDE5UUNwYXNzX0lNUFVURUR3aXRoUGhhc2luZ19yZWYxMDAwRzN2NV9hdXRvc29tZXNOb0NocjIxX3YwLjFfSlJTLnZjZi5neicgXAotLW91dHB1dCAnTUVHQV8wNDE4MjJfRXh0cmFjdGVkX2Zyb21fSW1wdXRlZFJlZjEwMDBHM3Y1X05vQ2hyMjFfdjAuMV9KUlMudmNmLmd6JwpgYGAKCiMjIyMgUHJldmlldyB0aGUgbmV3IFZDRiBvZiBleHRyYWN0ZWQgR1JTIFNOUHMKYGBge2Jhc2h9CmNkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YScKemNhdCA8ICdNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy52Y2YuZ3onIHwgaGVhZCAtbiA0NgpgYGAKCiMjIyMgRnJvbSB0aGUgVkNGIHByb2R1Y2VkIGFib3ZlLCBtYWtlIGEgUGxpbmsgYmluYXJ5IGZpbGVzZXQsIGEgUGxpbmsgcmF3IGZpbGUgb2YgYWxsZWxpYyBkb3NhZ2VzLCBhbmQgYSBQbGluayB0cmF3IGZpbGUgb2YgYWxsZWxpYyBkb3NhZ2VzCmBgYHtiYXNofQojIE5vdGU6IFVzZSAtLWNvbnN0LWZpZCB0byBtYWtlIG91dHB1dCB1c2Ugb25seSB0aGUgTUVHQSBJSUQuIFdlIHdpbGwgdXNlIEZhbWlseUlEIGFzIGRlZmluZWQgaW4gSFRQIGNsaW5pY2FsIGRhdGEgaW5zdGVhZCBvZiB0aGUgYXJiaXRyYXJ5IEZJRHMgc2hvd24gaW4gdGhlIE1FR0EgZGF0YS4KCmNkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YScKcGxpbmsyIC0tdmNmICdNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy52Y2YuZ3onIFwKLS1jb25zdC1maWQgXAotLW1ha2UtYmVkIFwKLS1vdXQgJ01FR0FfMDQxODIyX0V4dHJhY3RlZF9mcm9tX0ltcHV0ZWRSZWYxMDAwRzN2NV9Ob0NocjIxX3YwLjFfSlJTJwoKcGxpbmsyIC0tdmNmICdNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy52Y2YuZ3onIFwKLS1jb25zdC1maWQgXAotLWV4cG9ydCBBLXRyYW5zcG9zZSBcCi0tb3V0ICdNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUycKYGBgCgojIyMjIFJlYWQgaW4gdGhlIFBsaW5rICoudHJhdyBmaWxlIHByb2R1Y2VkIGFib3ZlIGFuZCBqb2luIGl0IHdpdGggdGhlIGRhdGFmcmFtZSBvZiBTTlAgbG9jYXRpb25zIHVzZWQgdG8gZXh0cmFjdCB0aGVzZSB2YXJpYW50cwpgYGB7cn0Kc2V0d2QoIi9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9EYXRhIikKaW1wdXRlZC50cmF3IDwtIGZyZWFkKCJNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy50cmF3IikgJT4lCiAgZ2F0aGVyKGtleSA9ICJJSUQiLCB2YWx1ZSA9ICJEb3NhZ2UiLCBjb250YWlucygiRE5BIikpICU+JQogIGZpbHRlcihncmVwbCgiSFRQIiwgSUlEKT09VFJVRSkgJT4lCiAgc2VsZWN0KC1jKGAoQylNYCkpICU+JQogIHJlbmFtZShEb3NhZ2UuQ09VTlRFRCA9IERvc2FnZSkgJT4lCiAgbXV0YXRlKEV4dHJhY3RlZCA9IDEpICU+JQogIGZ1bGxfam9pbih0b19leHRyYWN0ICU+JSByZW5hbWUoQ0hSX1BPUyA9IENIUl9CUCksIGJ5ID0gYygiQ0hSIj0iQ2hyIiwgIlBPUyI9IkJQIikpICU+JQogIG11dGF0ZShFeHRyYWN0ZWQgPSBpZmVsc2UoaXMubmEoRXh0cmFjdGVkKSwgMCwgRXh0cmFjdGVkKSkgJT4lCiAgZmlsdGVyKEluX09yaWdpbmFsX0dSUyA9PSAxIHwgSW5fUmV2aXNlZF9HUlMgPT0gMSkKCmltcHV0ZWQudHJhdwpgYGAKCiMjIyMgT2YgdGhlIDQ1IFNOUHMgd2UgdHJpZWQgdG8gZXh0cmFjdCwgaG93IG1hbnkgZGlkIHdlIGdldD8KYGBge3J9CmludmVudG9yeSA8LSBpbXB1dGVkLnRyYXcgJT4lCiAgc2VsZWN0KC1jKElJRCwgRG9zYWdlLkNPVU5URUQpKSAlPiUKICB1bmlxdWUoKSAlPiUKICBzZWxlY3QoR1JTX3JzSUQsIENIUiwgUE9TLCBDSFJfUE9TLCBJbl9PcmlnaW5hbF9HUlMsIEluX1JldmlzZWRfR1JTLCBldmVyeXRoaW5nKCkpCgppbnZlbnRvcnkKCmludmVudG9yeSAlPiUgZmlsdGVyKEV4dHJhY3RlZCA9PSAwKQoKaW52ZW50b3J5ICU+JQogIGZpbHRlcihJbl9PcmlnaW5hbF9HUlMgPT0gMSkgJT4lCiAgZ3JvdXBfYnkoQ0hSLCBJbl9PcmlnaW5hbF9HUlMsIEV4dHJhY3RlZCkgJT4lCiAgc3VtbWFyaXNlKE4gPSBuKCkpCiAgCmludmVudG9yeSAlPiUKICBmaWx0ZXIoSW5fUmV2aXNlZF9HUlMgPT0gMSkgJT4lCiAgZ3JvdXBfYnkoQ0hSLCBJbl9SZXZpc2VkX0dSUywgRXh0cmFjdGVkKSAlPiUKICBzdW1tYXJpc2UoTiA9IG4oKSkKCnByaW50KCJQZXJmZWN0LCB3ZSBnb3QgYWxsIG9mIHRoZSBTTlBzIGV4Y2VwdCBmb3IgdGhlIG9uZSBsb2NhdGVkIG9uIENocm9tb3NvbWUgMjEsIHdoaWNoIHdlIHB1cnBvc2VseSBleGNsdWRlZCBmcm9tIGltcHV0YXRpb24gYW5kIHdpbGwgZGVhbCB3aXRoIGxhdGVyLiIpCmBgYAoKCiMjIyMgQ2xlYW4gdXAgdGhlIHRyYXcgZGF0YWZyYW1lIGEgYml0CmBgYHtyfQppbXB1dGVkLnRyYXcwMSA8LSBpbXB1dGVkLnRyYXcgJT4lCiAgc2VsZWN0KC1jKENIUl9QT1MpKSAlPiUKICByZW5hbWUoVkNGX1ZhcmlhbnRJRCA9IFNOUCkgJT4lCiAgc2VsZWN0KElJRCwgVkNGX1ZhcmlhbnRJRCwgQ09VTlRFRCwgQUxULCBEb3NhZ2UuQ09VTlRFRCwgSW5fT3JpZ2luYWxfR1JTLCBJbl9SZXZpc2VkX0dSUywgRXh0cmFjdGVkLCBldmVyeXRoaW5nKCkpCgpybShpbXB1dGVkLnRyYXcpCgppbXB1dGVkLnRyYXcwMQpgYGAKCiMjIyMgVmVyaWZ5IHRoYXQgd2UgZ290IGJhY2sgb25seSBvbmUgdW5pcXVlIFNOUCBmb3IgZWFjaCBDSFI6QlAgZXh0cmFjdGVkIGZyb20gdGhlIGltcHV0ZWQgZGF0YXNldApgYGB7cn0KaW1wdXRlZC50cmF3MDEgJT4lCiAgc2VsZWN0KC1jKElJRCwgRG9zYWdlLkNPVU5URUQpKSAlPiUKICB1bmlxdWUoKSAlPiUKICBtdXRhdGUoQ0hSX1BPUyA9IHBhc3RlKENIUiwgUE9TLCBzZXAgPSAiOiIpKSAlPiUKICBzZWxlY3QoQ0hSX1BPUywgVkNGX1ZhcmlhbnRJRCkgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZ3JvdXBfYnkoQ0hSX1BPUykgICU+JQogIHN1bW1hcmlzZShOX1NOUHNfYXRfQ2hyQlAgPSBuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhOX1NOUHNfYXRfQ2hyQlApKQoKIyBHcmVhdC4KYGBgCgojIyMjIEV4dHJhY3QgaW1wdXRhdGlvbiBxdWFsaXR5IGluZm8gdXNpbmcgYmNmdG9vbHMKYGBge2Jhc2h9CiMgUHJpbnQgY2hyb21vc29tZSwgcG9zaXRpb24sIHJlZiBhbGxlbGUgYW5kIHRoZSBmaXJzdCBhbHRlcm5hdGUgYWxsZWxlCgojY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9EYXRhJwojYmNmdG9vbHMgcXVlcnkgLWYgJyVDSFJPTSAgJVBPUyAgJVJFRiAgJUFMVHswfSAlSU5GT1xuJyAnTUVHQV8wNDE4MjJfRXh0cmFjdGVkX2Zyb21fSW1wdXRlZFJlZjEwMDBHM3Y1X05vQ2hyMjFfdjAuMV9KUlMudmNmLmd6JyA+ICdNRUdBXzA0MTgyMl9RdWFsaXR5SU5GT19FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy50eHQnCgojY2F0ICdNRUdBXzA0MTgyMl9RdWFsaXR5SU5GT19FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy50eHQnCmBgYAoKIyMjIyBDbGVhbiB0aGUgZXh0cmFjdGVkIFZDRiBJTkZPIGZpZWxkCmBgYHtyfQpzZXR3ZChkaXIuRGF0YSkKZXh0cmFjdGVkLklORk8gPC0gZnJlYWQoIk1FR0FfMDQxODIyX1F1YWxpdHlJTkZPX0V4dHJhY3RlZF9mcm9tX0ltcHV0ZWRSZWYxMDAwRzN2NV9Ob0NocjIxX3YwLjFfSlJTLnR4dCIpICU+JQogIGBjb2xuYW1lczwtYChjKCJDSFIiLCAiUE9TIiwgIlJFRiIsICJBTFQiLCAiSU5GTyIpKSAlPiUKICBzZXBhcmF0ZShJTkZPLCBpbnRvID0gYygiQUYiLCAiTUFGIiwgIlIyIiwgInRlbXAxIiwgInRlbXAyIiksIHNlcCA9ICI7IiwgZXh0cmEgPSAibWVyZ2UiLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgbXV0YXRlKEVSMiA9IGlmZWxzZShncmVwbCgiRVIyIiwgdGVtcDEpPT1UUlVFLCB0ZW1wMSwgTkEpLAogICAgICAgICBUeXBlID0gaWZlbHNlKGdyZXBsKCJFUjIiLCB0ZW1wMSk9PUZBTFNFLCB0ZW1wMSwgdGVtcDIpKSAlPiUKICBzZWxlY3QoLWModGVtcDEsIHRlbXAyKSkgJT4lCiAgbXV0YXRlKEFGID0gZ3N1YigiQUY9IiwgIiIsIEFGKSwKICAgICAgICAgTUFGID0gZ3N1YigiTUFGPSIsICIiLCBNQUYpLAogICAgICAgICBSMiA9IGdzdWIoIlIyPSIsICIiLCBSMiksCiAgICAgICAgIEVSMiA9IGdzdWIoIkVSMj0iLCAiIiwgRVIyKSkKCmV4dHJhY3RlZC5JTkZPCmBgYAoKIyMjIyBDbGVhbiB1cCB0aGUgVkNGIElORk8gZGF0YWZyYW1lLCBzcGxpdCBpdCBieSBHUlMgdmVyc2lvbiwgYW5kIG91dHB1dCB0byBhbm5vdGF0aW9uIGZpbGVzCmBgYHtyfQppbXB1dGF0aW9uUUNpbmZvIDwtIGV4dHJhY3RlZC5JTkZPICU+JQogIGZ1bGxfam9pbihpbnZlbnRvcnksIGJ5ID0gaW50ZXJzZWN0KGNvbG5hbWVzKGV4dHJhY3RlZC5JTkZPKSwgY29sbmFtZXMoaW52ZW50b3J5KSkpCgojaW1wdXRhdGlvblFDaW5mbwoKaW1wdXRhdGlvblFDaW5mby5HUlNvcmlnIDwtIGltcHV0YXRpb25RQ2luZm8gJT4lCiAgcmVuYW1lKFZDRl9WYXJpYW50SUQgPSBTTlApICU+JQogIGZpbHRlcihJbl9PcmlnaW5hbF9HUlMgPT0gMSkgJT4lCiAgc2VsZWN0KC1jKEluX09yaWdpbmFsX0dSUywgSW5fUmV2aXNlZF9HUlMpKSAlPiUKICBtdXRhdGUoR1JTX3ZlcnNpb24gPSAiU2hhcnAgZXQgYWwuLCAyMDE5IikgJT4lCiAgc2VsZWN0KEdSU192ZXJzaW9uLCBHUlNfcnNJRCwgVkNGX1ZhcmlhbnRJRCwgQ0hSLCBQT1MsIFJFRiwgQUxULCBDT1VOVEVELCBldmVyeXRoaW5nKCkpICU+JQogIHNlbGVjdCgtYyhDSFJfUE9TKSkgJT4lCiAgcmVuYW1lKENPVU5URURfaW5fdHJhdyA9IENPVU5URUQpICU+JQogIG11dGF0ZShCdWlsZCA9ICJHUkNoMzciKQoKaW1wdXRhdGlvblFDaW5mby5HUlNyZXZpc2VkIDwtIGltcHV0YXRpb25RQ2luZm8gJT4lCiAgcmVuYW1lKFZDRl9WYXJpYW50SUQgPSBTTlApICU+JQogIGZpbHRlcihJbl9SZXZpc2VkX0dSUyA9PSAxKSAlPiUKICBzZWxlY3QoLWMoSW5fT3JpZ2luYWxfR1JTLCBJbl9SZXZpc2VkX0dSUykpICU+JQogIG11dGF0ZShHUlNfdmVyc2lvbiA9ICJTaGFycCBldCBhbC4sIDIwMjIiKSAlPiUKICBzZWxlY3QoR1JTX3ZlcnNpb24sIEdSU19yc0lELCBWQ0ZfVmFyaWFudElELCBDSFIsIFBPUywgUkVGLCBBTFQsIENPVU5URUQsIGV2ZXJ5dGhpbmcoKSkgJT4lCiAgc2VsZWN0KC1jKENIUl9QT1MpKSAlPiUKICByZW5hbWUoQ09VTlRFRF9pbl90cmF3ID0gQ09VTlRFRCkgJT4lCiAgbXV0YXRlKEJ1aWxkID0gIkdSQ2gzNyIpCgppbXB1dGF0aW9uUUNpbmZvLkdSU29yaWcKaW1wdXRhdGlvblFDaW5mby5HUlNyZXZpc2VkCgpzZXR3ZChkaXIuR1JTb3JpZ2luYWwuQW5ubykKZndyaXRlKGltcHV0YXRpb25RQ2luZm8uR1JTb3JpZywgIk1FR0FfMDQxODIyX0NEX0dSU19TaGFycDIwMTlfSW1wdXRhdGlvblFDaW5mb19HUkNoMzdfdjAuMV9KUlMuY3N2IikKCnNldHdkKGRpci5HUlNyZXZpc2VkLkFubm8pCmZ3cml0ZShpbXB1dGF0aW9uUUNpbmZvLkdSU3JldmlzZWQsICJNRUdBXzA0MTgyMl9DRF9HUlNfU2hhcnAyMDIyX0ltcHV0YXRpb25RQ2luZm9fR1JDaDM3X3YwLjFfSlJTLmNzdiIpCmBgYAoKYGBge3J9CiMgaW1wdXRhdGlvblFDaW5mby5HUlNvcmlnCiMgaW1wdXRlZC50cmF3MDEKCmltcHV0ZWQudHJhdy5HUlNvcmlnIDwtIGltcHV0YXRpb25RQ2luZm8uR1JTb3JpZyAlPiUKICByZW5hbWUoQ09VTlRFRCA9IENPVU5URURfaW5fdHJhdykgJT4lCiAgbGVmdF9qb2luKGltcHV0ZWQudHJhdzAxLAogICAgICAgICAgICBieSA9IGludGVyc2VjdChjb2xuYW1lcyhpbXB1dGF0aW9uUUNpbmZvLkdSU29yaWcgJT4lIHJlbmFtZShDT1VOVEVEID0gQ09VTlRFRF9pbl90cmF3KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGltcHV0ZWQudHJhdzAxKSkpICU+JQogIHNlbGVjdCgtYyhFeHRyYWN0ZWQsIEluX09yaWdpbmFsX0dSUywgSW5fUmV2aXNlZF9HUlMpKSAlPiUKICBzZWxlY3QoR1JTX3ZlcnNpb24sCiAgICAgICAgIEdSU19yc0lELAogICAgICAgICBWQ0ZfVmFyaWFudElELCBJSUQsIENPVU5URUQsIERvc2FnZS5DT1VOVEVELCAKICAgICAgICAgQ0hSLCBQT1MsIFJFRiwgQUxULCBJTkZPLCBBRiwgTUFGLCBSMiwgRVIyLCBUeXBlLAogICAgICAgICBldmVyeXRoaW5nKCkpICU+JQogIG11dGF0ZSh0ZW1wID0gZ3N1YigiX1dHIiwgIl98V0ciLCBJSUQpKSAlPiUKICBzZXBhcmF0ZSh0ZW1wLCBpbnRvID0gYygicm0iLCAiTUVHQS5JSUQiKSwgc2VwID0gIlt8XSIsIGV4dHJhID0gIm1lcmdlIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogIHNlbGVjdCgtYyhJSUQsIHRlbXAsIHJtKSkgJT4lCiAgc2VsZWN0KEdSU192ZXJzaW9uLCBNRUdBLklJRCwgR1JTX3JzSUQsIFZDRl9WYXJpYW50SUQsCiAgICAgICAgIENPVU5URUQsIERvc2FnZS5DT1VOVEVELCBldmVyeXRoaW5nKCkpICU+JQogIHVuaXF1ZSgpCgppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZCA8LSBpbXB1dGF0aW9uUUNpbmZvLkdSU3JldmlzZWQgJT4lCiAgcmVuYW1lKENPVU5URUQgPSBDT1VOVEVEX2luX3RyYXcpICU+JQogIGxlZnRfam9pbihpbXB1dGVkLnRyYXcwMSwKICAgICAgICAgICAgYnkgPSBpbnRlcnNlY3QoY29sbmFtZXMoaW1wdXRhdGlvblFDaW5mby5HUlNyZXZpc2VkICU+JSByZW5hbWUoQ09VTlRFRCA9IENPVU5URURfaW5fdHJhdykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhpbXB1dGVkLnRyYXcwMSkpKSAlPiUKICBzZWxlY3QoLWMoRXh0cmFjdGVkLCBJbl9PcmlnaW5hbF9HUlMsIEluX1JldmlzZWRfR1JTKSkgJT4lCiAgc2VsZWN0KEdSU192ZXJzaW9uLAogICAgICAgICBHUlNfcnNJRCwKICAgICAgICAgVkNGX1ZhcmlhbnRJRCwgSUlELCBDT1VOVEVELCBEb3NhZ2UuQ09VTlRFRCwgCiAgICAgICAgIENIUiwgUE9TLCBSRUYsIEFMVCwgSU5GTywgQUYsIE1BRiwgUjIsIEVSMiwgVHlwZSwKICAgICAgICAgZXZlcnl0aGluZygpKSAlPiUKICBtdXRhdGUodGVtcCA9IGdzdWIoIl9XRyIsICJffFdHIiwgSUlEKSkgJT4lCiAgc2VwYXJhdGUodGVtcCwgaW50byA9IGMoInJtIiwgIk1FR0EuSUlEIiksIHNlcCA9ICJbfF0iLCBleHRyYSA9ICJtZXJnZSIsIHJlbW92ZSA9IEZBTFNFKSAlPiUKICBzZWxlY3QoLWMoSUlELCB0ZW1wLCBybSkpICU+JQogIHNlbGVjdChHUlNfdmVyc2lvbiwgTUVHQS5JSUQsIEdSU19yc0lELCBWQ0ZfVmFyaWFudElELAogICAgICAgICBDT1VOVEVELCBEb3NhZ2UuQ09VTlRFRCwgZXZlcnl0aGluZygpKSAlPiUKICB1bmlxdWUoKQoKaW1wdXRlZC50cmF3LkdSU29yaWcKaW1wdXRlZC50cmF3LkdSU3JldmlzZWQKYGBgCgojIyMjIEFkZCBIVFAgc3R1ZHkgaWRlbnRpZmllcnMgKEZhbWlseUlELCBSZWNvcmRJRCwgTGFiSUQpCmBgYHtyfQojIE1FR0EuSURrZXkKIyBpbXB1dGVkLnRyYXcuR1JTb3JpZwojIGltcHV0ZWQudHJhdy5HUlNyZXZpc2VkCgpzZXR3ZChkaXIuRGF0YSkKTUVHQS5JRGtleSA8LSBmcmVhZCgiTUVHQV8wNDE4MjJfTUVHQTJfdG9fSFRQX0lEX2tleV92MC4xX0pSUy5jc3YiKSAlPiUKICBmaWx0ZXIoSFRQX3BhcnRpY2lwYW50ID09ICJZZXMiKSAlPiUKICBzZWxlY3QoRmFtaWx5SUQsIFJlY29yZElELCBNRUdBLkZJRCwgTUVHQS5JSUQsIE1FR0EuTGFiSUQpICU+JQogIHVuaXF1ZSgpCgppbXB1dGVkLnRyYXcuR1JTb3JpZzAxIDwtIGltcHV0ZWQudHJhdy5HUlNvcmlnICU+JQogIGZ1bGxfam9pbihNRUdBLklEa2V5LCBieSA9ICJNRUdBLklJRCIpICU+JQogIHNlbGVjdChGYW1pbHlJRCwgUmVjb3JkSUQsIE1FR0EuRklELCBNRUdBLklJRCwgTUVHQS5MYWJJRCwgR1JTX3JzSUQsIENPVU5URUQsIERvc2FnZS5DT1VOVEVELCBldmVyeXRoaW5nKCkpICU+JQogIHVuaXF1ZSgpCgppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZDAxIDwtIGltcHV0ZWQudHJhdy5HUlNyZXZpc2VkICU+JQogIGZ1bGxfam9pbihNRUdBLklEa2V5LCBieSA9ICJNRUdBLklJRCIpICU+JQogIHNlbGVjdChGYW1pbHlJRCwgUmVjb3JkSUQsIE1FR0EuRklELCBNRUdBLklJRCwgTUVHQS5MYWJJRCwgR1JTX3JzSUQsIENPVU5URUQsIERvc2FnZS5DT1VOVEVELCBldmVyeXRoaW5nKCkpICU+JQogIHVuaXF1ZSgpCgppbXB1dGVkLnRyYXcuR1JTb3JpZzAxCmltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDEKYGBgCgojIyMjIFByb2R1Y2UgYSBzdW1tYXJ5IG9mIGhvdyBmYXIgYXBhcnQgdGhlIGFtYmlndW91cyBTTlBzIHVzZWQgaW4gR1JTIDIwMTkgYXJlIGZyb20gdGhlaXIgcmVwbGFjZW1lbnRzIHVzZWQgaW4gdGhlIEdSUyAyMDIyCmBgYHtyfQpkZWx0YUNoclBvc19yZXBsYWNlZFNOUHMgPC0gYW5uby5yZXZpc2VkR1JTICU+JQogIGZpbHRlcighaXMubmEoUkVQTEFDSU5HKSkgJT4lCiAgZmlsdGVyKENPTVBPTkVOVCA9PSAiTm9uLUhMQSIpICU+JQogIHJlbmFtZShHUlNfQ29tcG9uZW50ID0gQ09NUE9ORU5ULAogICAgICAgICBTY29yZV9BbGxlbGUucmV2aXNlZCA9IFNDT1JFX0FMTEVMRSwKICAgICAgICAgYFNjb3JlX1dlaWdodC5yZXZpc2VkYCA9IFNDT1JFLAogICAgICAgICBTdHJhbmQucmV2aXNlZCA9IFNUUkFORCkgJT4lCiAgcmVuYW1lKEdSU19yc0lELnJldmlzZWQgPSBSU0lELAogICAgICAgICBHUlNfcnNJRC5vcmlnaW5hbCA9IFJFUExBQ0lORykgJT4lCiAgc2VsZWN0KC1jKGBGcmVxX1VLQihBMSlgLCBgRnJlcV9VS0IoQTIpYCwgYDEwMDBHP2AsCiAgICAgICAgICAgIEExLCBBMikpICU+JQogIHNlbGVjdChHUlNfQ29tcG9uZW50LCBHUlNfcnNJRC5yZXZpc2VkLCBHUlNfcnNJRC5vcmlnaW5hbCwgU2NvcmVfQWxsZWxlLnJldmlzZWQsIFNjb3JlX1dlaWdodC5yZXZpc2VkLCBQT1NJVElPTl9EQlNOUDE1MSkgJT4lCiAgc2VwYXJhdGUoUE9TSVRJT05fREJTTlAxNTEsIGludG8gPSBjKCJDaHJfcnNJRC5yZXZpc2VkIiwgIlBvc19yc0lELnJldmlzZWQiKSwgc2VwID0gIjoiLCBleHRyYSA9ICJtZXJnZSIsIHJlbW92ZSA9IFRSVUUpICU+JQogIGxlZnRfam9pbihHUkNoMzcuR1JTb3JpZyAlPiUKICAgICAgICAgICAgICByZW5hbWUoR1JTX3JzSUQub3JpZ2luYWwgPSBHUlNfcnNJRCwKICAgICAgICAgICAgICAgICAgICAgQ2hyX3JzSUQub3JpZ2luYWwgPSBDaHIsCiAgICAgICAgICAgICAgICAgICAgIFBvc19yc0lELm9yaWdpbmFsID0gQlApLAogICAgICAgICAgICBieSA9ICJHUlNfcnNJRC5vcmlnaW5hbCIpICU+JQogIGxlZnRfam9pbihzaGFycFMzICU+JQogICAgICAgICAgICAgIHNlbGVjdChQdXRhdGl2ZS5HZW5lLCBTTlAsIEFsbGVsZSwgYFdlaWdodC4ozrIpYCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKFB1dGF0aXZlX0dlbmUub3JpZ2luYWwgPSBQdXRhdGl2ZS5HZW5lLCBHUlNfcnNJRC5vcmlnaW5hbCA9IFNOUCwgU2NvcmVfQWxsZWxlLm9yaWdpbmFsID0gQWxsZWxlLCBTY29yZV9XZWlnaHQub3JpZ2luYWwgPSBgV2VpZ2h0LijOsilgKSwKICAgICAgICAgICAgYnkgPSAiR1JTX3JzSUQub3JpZ2luYWwiKSAlPiUKICBzZWxlY3QoR1JTX0NvbXBvbmVudCwKICAgICAgICAgR1JTX3JzSUQub3JpZ2luYWwsIFNjb3JlX0FsbGVsZS5vcmlnaW5hbCwgU2NvcmVfV2VpZ2h0Lm9yaWdpbmFsLCBDaHJfcnNJRC5vcmlnaW5hbCwgUG9zX3JzSUQub3JpZ2luYWwsCiAgICAgICAgIEdSU19yc0lELnJldmlzZWQsIFNjb3JlX0FsbGVsZS5yZXZpc2VkLCBTY29yZV9XZWlnaHQucmV2aXNlZCwgQ2hyX3JzSUQucmV2aXNlZCwgUG9zX3JzSUQucmV2aXNlZCwKICAgICAgICAgZXZlcnl0aGluZygpKSAlPiUKICBtdXRhdGUoQ2hyX3JzSUQub3JpZ2luYWwgPSBhcy5udW1lcmljKENocl9yc0lELm9yaWdpbmFsKSwKICAgICAgICAgQ2hyX3JzSUQucmV2aXNlZCA9IGFzLm51bWVyaWMoQ2hyX3JzSUQucmV2aXNlZCksCiAgICAgICAgIFBvc19yc0lELm9yaWdpbmFsID0gYXMubnVtZXJpYyhQb3NfcnNJRC5vcmlnaW5hbCksCiAgICAgICAgIFBvc19yc0lELnJldmlzZWQgPSBhcy5udW1lcmljKFBvc19yc0lELnJldmlzZWQpKSAlPiUKICBtdXRhdGUoZGVsdGEuQ2hyID0gQ2hyX3JzSUQucmV2aXNlZCAtIENocl9yc0lELm9yaWdpbmFsLAogICAgICAgICBkZWx0YS5Qb3MgPSBQb3NfcnNJRC5yZXZpc2VkIC0gUG9zX3JzSUQub3JpZ2luYWwpICU+JQogIHNlbGVjdChHUlNfcnNJRC5vcmlnaW5hbCwgR1JTX3JzSUQucmV2aXNlZCwgZGVsdGEuQ2hyLCBkZWx0YS5Qb3MsIGV2ZXJ5dGhpbmcoKSkgJT4lCiAgc2VsZWN0KEdSU19yc0lELm9yaWdpbmFsLCBHUlNfcnNJRC5yZXZpc2VkLCBDaHJfcnNJRC5vcmlnaW5hbCwgUG9zX3JzSUQub3JpZ2luYWwsIENocl9yc0lELnJldmlzZWQsIFBvc19yc0lELnJldmlzZWQsIGRlbHRhLkNociwgZGVsdGEuUG9zKQoKZGVsdGFDaHJQb3NfcmVwbGFjZWRTTlBzCgpzZXR3ZChkaXIuR1JTcmV2aXNlZC5Bbm5vKQpmd3JpdGUoZGVsdGFDaHJQb3NfcmVwbGFjZWRTTlBzLCAiTUVHQV8wNDE4MjJfRGVsdGFDaHJQb3NfR1JTX3JzSURfb3JpZ2luYWxfdnNfcmVwbGFjZW1lbnRfdjAuMV9KUlMuY3N2IikKYGBgCgpgYGB7YmFzaH0KI2NkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YScKI3dnZXQgJ2h0dHBzOi8vYW5hbHlzaXN0b29scy5jYW5jZXIuZ292L0xEbGluay90bXAvTERwYWlyXzA0MTgzODg1NDIudHh0JwojbXYgJ0xEcGFpcl8wNDE4Mzg4NTQyLnR4dCcgJ0xEcGFpcl9yczEzNTkwNjJfcnMxMzIzMjkyLnR4dCcKYGBgCgpgYGB7YmFzaH0KI2NkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YScKI3dnZXQgJ2h0dHBzOi8vYW5hbHlzaXN0b29scy5jYW5jZXIuZ292L0xEbGluay90bXAvTERwYWlyXzA0MzgxNjc2NzQudHh0JwojbXYgJ0xEcGFpcl8wNDM4MTY3Njc0LnR4dCcgJ0xEcGFpcl9yczEyMTQyMjgwX3JzMTE4MDExODMudHh0JwpgYGAKCmBgYHtiYXNofQojIHJzMjM4NzM5Nwlyczk0NzQ3NAojY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9BTkFMWVNJUy9DZWxpYWNfTXVsdGlPbWljcy9HUlMvRFNNSUdfU2hhcmVkL01hbnVzY3JpcHRfRmlndXJlMS9EYXRhJwojd2dldCAnaHR0cHM6Ly9hbmFseXNpc3Rvb2xzLmNhbmNlci5nb3YvTERsaW5rL3RtcC9MRHBhaXJfMDQzOTIwODU3MS50eHQnCiNtdiAnTERwYWlyXzA0MzkyMDg1NzEudHh0JyAnTERwYWlyX3JzMjM4NzM5N19yczk0NzQ3NC50eHQnCmBgYAoKYGBge3J9CiMgIkxEcGFpcl9yczEyMTQyMjgwX3JzMTE4MDExODMudHh0IiAiTERwYWlyX3JzMTM1OTA2Ml9yczEzMjMyOTIudHh0IiAgICJMRHBhaXJfcnMyMzg3Mzk3X3JzOTQ3NDc0LnR4dCIKCnNldHdkKGRpci5EYXRhKQpkYXRhLkxEcGFpcnMgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gIkxEcGFpciIpICU+JQogIGxhcHBseShmcmVhZCwgZmlsbCA9IFRSVUUpCgpkYXRhLkxEcGFpcnMKCnRlbXAgPC0gbGlzdCgpCmZvciAoIGkgaW4gMTpsZW5ndGgoZGF0YS5MRHBhaXJzKSApewogIHRlbXBbW2ldXSA8LSBkYXRhLkxEcGFpcnNbW2ldXSAlPiUgc2VsZWN0KFYxLCBWMikgJT4lIGZpbHRlcihWMSA9PSAiRCc6IiB8IFYxID09ICJSMjoiIHwgVjEgPT0gIkNoaS1zcToiIHwgVjEgPT0gInAtdmFsdWU6IikgJT4lCiAgICBtdXRhdGUoZHVtbXkgPSAxLAogICAgICAgICAgIFYxID0gZ3N1YigiOiIsICIiLCBWMSksCiAgICAgICAgICAgUG9wdWxhdGlvbiA9IGRhdGEuTERwYWlyc1tbaV1dJFYxWzVdKSAlPiUKICAgIHNwcmVhZChrZXkgPSBWMSwgdmFsdWUgPSBWMikgJT4lCiAgICBzZWxlY3QoLWR1bW15KSAlPiUKICAgIGNiaW5kKC4sCiAgICAgICAgICBkYXRhLkxEcGFpcnNbW2ldXSAlPiUKICAgICAgICAgICAgZmlsdGVyKGdyZXBsKCJycyIsIFYxKT09VFJVRSkgJT4lCiAgICAgICAgICAgIHNlbGVjdChWMSkgJT4lCiAgICAgICAgICAgIHVuaXF1ZSgpICU+JQogICAgICAgICAgICBmaWx0ZXIoZ3JlcGwoIlsoXSIsIFYxKT09RkFMU0UpICU+JQogICAgICAgICAgICB0KCkgJT4lCiAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUKICAgICAgICAgICAgcmVuYW1lKFNOUDEgPSBWMSwgU05QMiA9IFYyKSkgJT4lCiAgICAjIGNiaW5kKC4sCiAgICAjICAgICAgIGRhdGEuTERwYWlyc1tbaV1dICU+JQogICAgIyAgICAgICAgIGZpbHRlcihncmVwbCgiXyIsIFYxKT09VFJVRSkgJT4lCiAgICAjICAgICAgICAgc2VsZWN0KFYxLCBWMykgJT4lCiAgICAjICAgICAgICAgdW5pcXVlKCkgJT4lCiAgICAjICAgICAgICAgcmVuYW1lKFNOUDFhbGxlbGVfU05QMmFsbGVsZSA9IFYxLAogICAgIyAgICAgICAgICAgICAgICBDb3JyZWxhdGlvbiA9IFYzKSkgJT4lCiAgICAjbXV0YXRlKFNOUDFhbGxlbGVfU05QMmFsbGVsZSA9IGdzdWIoIls6XSIsICIiLCBWMSkpICU+JQogICAgI3NlcGFyYXRlKFNOUDFhbGxlbGVfU05QMmFsbGVsZSwgaW50byA9IGMoIlNOUDFfQWxsZWxlIiwgIlNOUDJfQWxsZWxlIiksIHNlcCA9ICJfIiwgZXh0cmEgPSAibWVyZ2UiLCByZW1vdmUgPSBUUlVFKSAlPiUKICAgIHNlbGVjdChQb3B1bGF0aW9uLCBTTlAxLCBTTlAyLAogICAgICAgICAgIGBEJ2AsIFIyLCBgQ2hpLXNxYCwgYHAtdmFsdWVgLAogICAgICAgICAgICNTTlAxX0FsbGVsZSwgU05QMl9BbGxlbGUsCiAgICAgICAgICAgZXZlcnl0aGluZygpKSAlPiUKICAgIHJlbmFtZShHUlNfcnNJRC5vcmlnaW5hbCA9IFNOUDEsCiAgICAgICAgICAgR1JTX3JzSUQucmV2aXNlZCA9IFNOUDIpCiAgI211dGF0ZShDb3JyZWxhdGlvbiA9IGdzdWIoIlsoXSIsICIiLCBDb3JyZWxhdGlvbiksCiAgIyAgICAgICBDb3JyZWxhdGlvbiA9IGdzdWIoIlspXSIsICIiLCBDb3JyZWxhdGlvbikpCn0KCkxEc3RhdHMgPC0gdGVtcCAlPiUgcmJpbmRsaXN0KCkKCkxEc3RhdHMKCnNldHdkKGRpci5HUlNyZXZpc2VkLkFubm8pCmZ3cml0ZShMRHN0YXRzLCAiTUVHQV8wNDE4MjJfTERfR1JTX3JzSURfb3JpZ2luYWxfdnNfcmVwbGFjZW1lbnRfdjAuMV9KUlMuY3N2IikKCiNzZXR3ZChkaXIuR1JTcmV2aXNlZC5Bbm5vKQojTERzdGF0cyA8LSBmcmVhZCgiTUVHQV8wNDE4MjJfTERfR1JTX3JzSURfb3JpZ2luYWxfdnNfcmVwbGFjZW1lbnRfdjAuMV9KUlMuY3N2IikKI0xEc3RhdHMKYGBgCgojIyMjIFZlcmlmeSB0aGF0IGJvdGggZG9zYWdlIGRhdGFmcmFtZXMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgdW5pcXVlIElJRHMKYGBge3J9CmltcHV0ZWQudHJhdy5HUlNvcmlnMDEgJT4lCiAgc2VsZWN0KE1FR0EuSUlEKSAlPiUKICB1bmlxdWUoKSAlPiUKICBucm93KCkKCmltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDEgJT4lCiAgc2VsZWN0KE1FR0EuSUlEKSAlPiUKICB1bmlxdWUoKSAlPiUKICBucm93KCkKYGBgCgojIyMjIENyZWF0ZSBhIGRhdGFmcmFtZSB0aGF0IG1hcHMgdGhlIHJzSURzIGluIHRoZSByZXZpc2VkIEdSUyB0byB0aGUgY29ycmVzcG9uZGluZyBQdXRhdGl2ZSBHZW5lIHJlcG9ydGVkIGluIHRoZSBTaGFycCAyMDE5IHBhcGVyLCBhbmQgdG8gdGhlICdDT01QT05FTlQnIGNvbHVtbiBpbiB0aGUgYW5ub3RhdGlvbiBmb3IgdGhlIHJldmlzZWQgR1JTCmBgYHtyfQpHUlNyZXZpc2VkX21hcF9QdXRhdGl2ZUdlbmVzMjAxOSA8LSBhbm5vLnJldmlzZWRHUlMgJT4lCiAgc2VsZWN0KENPTVBPTkVOVCwgUlNJRCwgUkVQTEFDSU5HKSAlPiUKICB1bmlxdWUoKSAlPiUKICBmaWx0ZXIoUlNJRCAlaW4lIHNoYXJwUzMkU05QIHwKICAgICAgICAgICBSRVBMQUNJTkcgJWluJSBzaGFycFMzJFNOUCkgJT4lCiAgbGVmdF9qb2luKHNoYXJwUzMsIGJ5ID0gYygiUlNJRCIgPSAiU05QIikpICU+JQogIGxlZnRfam9pbihzaGFycFMzLCBieSA9IGMoIlJFUExBQ0lORyIgPSAiU05QIikpICU+JQogIG11dGF0ZShgUHV0YXRpdmUgR2VuZSAoU2hhcnAgMjAxOSlgID0gaWZlbHNlKGlzLm5hKFB1dGF0aXZlLkdlbmUueCkgJiAhaXMubmEoUHV0YXRpdmUuR2VuZS55KSwgUHV0YXRpdmUuR2VuZS55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShQdXRhdGl2ZS5HZW5lLnkpICYgIWlzLm5hKFB1dGF0aXZlLkdlbmUueCksIFB1dGF0aXZlLkdlbmUueCwgTkEpKSkgJT4lCiAgcmVuYW1lKGBHUlMgQ29tcG9uZW50IChTaGFycCAyMDIyKWAgPSBDT01QT05FTlQpICU+JQogIHNlbGVjdChgR1JTIENvbXBvbmVudCAoU2hhcnAgMjAyMilgLCBgUHV0YXRpdmUgR2VuZSAoU2hhcnAgMjAxOSlgLCBSU0lELCBSRVBMQUNJTkcpICU+JQogIHVuaXF1ZSgpICU+JQogIHJlbmFtZShgVmFyaWFudCAoU2hhcnAgMjAyMilgID0gUlNJRCwKICAgICAgICAgYFZhcmlhbnQgKFNoYXJwIDIwMTkpYCA9IFJFUExBQ0lORykgJT4lCiAgbXV0YXRlKGBWYXJpYW50IChTaGFycCAyMDE5KWAgPSBpZmVsc2UoaXMubmEoYFZhcmlhbnQgKFNoYXJwIDIwMTkpYCksIGBWYXJpYW50IChTaGFycCAyMDIyKWAsIGBWYXJpYW50IChTaGFycCAyMDE5KWApKSAlPiUKICBtdXRhdGUoUmVwbGFjZWRfVmFyaWFudCA9IGlmZWxzZShgVmFyaWFudCAoU2hhcnAgMjAxOSlgICE9IGBWYXJpYW50IChTaGFycCAyMDIyKWAsICJZZXMiLCAiTm8iKSkgJT4lCiAgbXV0YXRlKGBHUlMgQ29tcG9uZW50IChTaGFycCAyMDE5KWAgPSAiTm9uLUhMQS1EUSIpICU+JQogIHNlbGVjdChgVmFyaWFudCAoU2hhcnAgMjAxOSlgLCBgVmFyaWFudCAoU2hhcnAgMjAyMilgLCBSZXBsYWNlZF9WYXJpYW50LAogICAgICAgICAgYEdSUyBDb21wb25lbnQgKFNoYXJwIDIwMTkpYCwgYEdSUyBDb21wb25lbnQgKFNoYXJwIDIwMjIpYCwKICAgICAgICAgZXZlcnl0aGluZygpKQoKR1JTcmV2aXNlZF9tYXBfUHV0YXRpdmVHZW5lczIwMTkKCnNldHdkKGRpci5HUlNyZXZpc2VkLkFubm8pCmZ3cml0ZShHUlNyZXZpc2VkX21hcF9QdXRhdGl2ZUdlbmVzMjAxOSwgIk1FR0FfMDQxODIyX0dSUzIwMjJDT01QT05FTlRfdG9fR1JTMjAxOVB1dGF0aXZlR2VuZV9HUlMyMDE5bm9uSExBRFFTTlBzT25seV92MC4xX0pSUy5jc3YiKQpzZXR3ZChkaXIuR1JTb3JpZ2luYWwuQW5ubykKZndyaXRlKEdSU3JldmlzZWRfbWFwX1B1dGF0aXZlR2VuZXMyMDE5LCAiTUVHQV8wNDE4MjJfR1JTMjAyMkNPTVBPTkVOVF90b19HUlMyMDE5UHV0YXRpdmVHZW5lX0dSUzIwMTlub25ITEFEUVNOUHNPbmx5X3YwLjFfSlJTLmNzdiIpCmBgYAoKIyMjIyBQcm9kdWNlIGEgbGlzdCBvZiBvbmx5IHRoZSBTTlBzIHRoYXQgYXJlIG5vdCBoYXBsb3R5cGUtdGFnZ2luZyBTTlBzIHVzZWQgaW4gZWl0aGVyIHZlcnNpb24gb2YgdGhlIEdSUwpgYGB7cn0Kbm9uSExBRFFfU05Qcy5HUlNvcmlnIDwtIEdSU3JldmlzZWRfbWFwX1B1dGF0aXZlR2VuZXMyMDE5ICU+JQogIGZpbHRlcihgR1JTIENvbXBvbmVudCAoU2hhcnAgMjAxOSlgID09ICJOb24tSExBLURRIikgJT4lCiAgc2VsZWN0KGBWYXJpYW50IChTaGFycCAyMDE5KWApICU+JQogIHVuaXF1ZSgpCgpub25ITEFEUV9TTlBzLkdSU3JldmlzZWQgPC0gR1JTcmV2aXNlZF9tYXBfUHV0YXRpdmVHZW5lczIwMTkgJT4lCiAgZmlsdGVyKGBHUlMgQ29tcG9uZW50IChTaGFycCAyMDE5KWAgPT0gIk5vbi1ITEEtRFEiKSAlPiUKICBzZWxlY3QoYFZhcmlhbnQgKFNoYXJwIDIwMjIpYCkgJT4lCiAgdW5pcXVlKCkKCm5vbkhMQURRX1NOUHMuR1JTb3JpZwpub25ITEFEUV9TTlBzLkdSU3JldmlzZWQKYGBgCgojIyMjIEZpbHRlciB0aGUgY2xlYW5lZCBkYXRhZnJhbWVzIG9mIGRvc2FnZSBkYXRhIHRvIGtlZXAgb25seSB0aGUgU05QcyB0aGF0IGFyZSBub3QgZm9yIHRhZ2dpbmcgb2YgSExBLURRIGhhcGxvdHlwZXMsIGJlY2F1c2Ugb3VyIEdSUyBhbmFseXNpcyB1c2VzIHRoZSBISUJBRy1pbXB1dGVkIEhMQSBhbGxlbGVzIHRvIGluZmVyIEhMQS1EUSBnZW5vdHlwZXMKYGBge3J9CmltcHV0ZWQudHJhdy5HUlNvcmlnMDIgPC0gaW1wdXRlZC50cmF3LkdSU29yaWcwMSAlPiUKICBmaWx0ZXIoR1JTX3JzSUQgJWluJSBub25ITEFEUV9TTlBzLkdSU29yaWckYFZhcmlhbnQgKFNoYXJwIDIwMTkpYCkKCmltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDIgPC0gaW1wdXRlZC50cmF3LkdSU3JldmlzZWQwMSAlPiUKICBmaWx0ZXIoR1JTX3JzSUQgJWluJSBub25ITEFEUV9TTlBzLkdSU3JldmlzZWQkYFZhcmlhbnQgKFNoYXJwIDIwMjIpYCkKCmltcHV0ZWQudHJhdy5HUlNvcmlnMDIkR1JTX3JzSUQgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGgoKQppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZDAyJEdSU19yc0lEICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkKI1sxXSAzOAojWzFdIDM4CgppbXB1dGVkLnRyYXcuR1JTb3JpZzAyCmltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDIKCnByaW50KCJXZSBoYXZlIG5vdyBwcmVwYXJlZCBvbmUgZGF0YWZyYW1lIG9mIG5vbi1ITEEtRFEgU05QIGRvc2FnZSBkYXRhIGZvciB0aGUgcnNJRHMgdXNlZCBpbiB0aGUgR1JTIHB1Ymxpc2hlZCBpbiAyMDE5LCBhbmQgb25lIGRhdGFmcmFtZSBvZiBub24tSExBLURRIFNOUCBkb3NhZ2UgZGF0YSBmb3IgdGhlIHJzSURzIHVzZWQgaW4gdGhlIHJldmlzZWQgR1JTIHNoYXJlZCBvbiBnaXRodWIgaW4gMjAyMi4gSW4gYm90aCBjYXNlcyB0aGUgR1JTIGludm9sdmVzIGEgdG90YWwgb2YgMzggbm9uLUhMQS1EUSBTTlBzLiIpCmBgYAoKIyMjIyBWZXJpZnkgdGhhdCBlYWNoIHZlcnNpb24gb2YgdGhlIG5vbi1ITEEtRFEgU05QIGRvc2FnZSBkYXRhIGluY2x1ZGVzIHRoZSBzYW1lIG51bWJlciBvZiBpbmRpdmlkdWFscyAoTUVHQS5JSURzKQpgYGB7cn0KaW1wdXRlZC50cmF3LkdSU29yaWcwMiAlPiUKICBzZWxlY3QoTUVHQS5JSUQpICU+JQogIHVuaXF1ZSgpICU+JQogIG5yb3coKQoKaW1wdXRlZC50cmF3LkdSU3JldmlzZWQwMiAlPiUKICBzZWxlY3QoTUVHQS5JSUQpICU+JQogIHVuaXF1ZSgpICU+JQogIG5yb3coKQoKcHJpbnQoIk5vbi1ITEEtRFEgU05QIGRvc2FnZSBkYXRhIGZvciB0aGUgMjAxOSBHUlMgaW5jbHVkZXMgMjIyIElJRHMuIikKcHJpbnQoIk5vbi1ITEEtRFEgU05QIGRvc2FnZSBkYXRhIGZvciB0aGUgMjAyMiBHUlMgaW5jbHVkZXMgMjIyIElJRHMuIikKYGBgCgpgYGB7cn0KaW1wdXRlZC50cmF3LkdSU29yaWcwMiAlPiUgIyBucm93ID0gODE3OAogIGZpbHRlcihncmVwbCgiSFRQIiwgTUVHQS5MYWJJRCk9PVRSVUUpICU+JSAjIG5yb3cgPSAgODE3NyAlPiUKICBmaWx0ZXIoZ3JlcGwoIkIiLCBNRUdBLkxhYklEKT09RkFMU0UpICMgbnJvdyA9ICA4MDY2CgppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZDAyICU+JSAjIG5yb3cgPSA4MTc4CiAgZmlsdGVyKGdyZXBsKCJIVFAiLCBNRUdBLkxhYklEKT09VFJVRSkgJT4lICMgbnJvdyA9ICA4MTc3ICU+JQogIGZpbHRlcihncmVwbCgiQiIsIE1FR0EuTGFiSUQpPT1GQUxTRSkgIyBucm93ID0gIDgwNjYKCmltcHV0ZWQudHJhdy5HUlNvcmlnMDMgPC0gaW1wdXRlZC50cmF3LkdSU29yaWcwMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIkhUUCIsIE1FR0EuTGFiSUQpPT1UUlVFICYgIyBSZW1vdmUgdGhlIHJvdyB3aXRoIG5vIE1FR0EuTGFiSUQgYmVjYXVzZSBpdCBpcyBhIHJlZmVyZW5jZSBzYW1wbGUgKGJlZ2lubmluZyB3aXRoICdfTkEnKSB0aGF0IGlzIHVzZWQgb24gYWxsIElsbHVtaW5hIGFycmF5cyAoaS5lLiwgaXQncyBub3QgYW4gSFRQIHBhcnRpY2lwYW50KQogICAgICAgICAgIGdyZXBsKCJCIiwgTUVHQS5MYWJJRCk9PUZBTFNFKSAjIFJlbW92ZSBEMjFzCgppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZDAzIDwtaW1wdXRlZC50cmF3LkdSU3JldmlzZWQwMiAlPiUKICBmaWx0ZXIoZ3JlcGwoIkhUUCIsIE1FR0EuTGFiSUQpPT1UUlVFICYgIyBSZW1vdmUgdGhlIHJvdyB3aXRoIG5vIE1FR0EuTGFiSUQgYmVjYXVzZSBpdCBpcyBhIHJlZmVyZW5jZSBzYW1wbGUgKGJlZ2lubmluZyB3aXRoICdfTkEnKSB0aGF0IGlzIHVzZWQgb24gYWxsIElsbHVtaW5hIGFycmF5cyAoaS5lLiwgaXQncyBub3QgYW4gSFRQIHBhcnRpY2lwYW50KQogICAgICAgICAgIGdyZXBsKCJCIiwgTUVHQS5MYWJJRCk9PUZBTFNFKSAjIFJlbW92ZSBEMjFzCgppbXB1dGVkLnRyYXcuR1JTb3JpZzAyCmltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDIKaW1wdXRlZC50cmF3LkdSU29yaWcwMwppbXB1dGVkLnRyYXcuR1JTcmV2aXNlZDAzCmBgYAoKIyMjIyBPdXRwdXQgU05QIGRvc2FnZSBkYXRhIHRvIGZpbGVzCmBgYHtyfQpzZXR3ZChkaXIuRGF0YSkKZndyaXRlKGltcHV0ZWQudHJhdy5HUlNvcmlnMDMsICJNRUdBXzA0MTgyMl9Eb3NhZ2VfR1JTMjAxOV9JbXB1dGVkUmVmMTAwMEczdjVfZXhjbHVkaW5nQ2hyMjFzbnBfMC4xX0pSUy5jc3YiKQpmd3JpdGUoaW1wdXRlZC50cmF3LkdSU29yaWcwMywgIk1FR0FfMDQxODIyX0Rvc2FnZV9HUlMyMDE5X0ltcHV0ZWRSZWYxMDAwRzN2NV9leGNsdWRpbmdDaHIyMXNucF8wLjFfSlJTLnRzdiIsIHNlcCA9ICJcdCIpCgpzZXR3ZChkaXIuRGF0YSkKZndyaXRlKGltcHV0ZWQudHJhdy5HUlNyZXZpc2VkMDMsICJNRUdBXzA0MTgyMl9Eb3NhZ2VfR1JTMjAyMl9JbXB1dGVkUmVmMTAwMEczdjVfZXhjbHVkaW5nQ2hyMjFzbnBfMC4xX0pSUy5jc3YiKQpmd3JpdGUoaW1wdXRlZC50cmF3LkdSU3JldmlzZWQwMywgIk1FR0FfMDQxODIyX0Rvc2FnZV9HUlMyMDIyX0ltcHV0ZWRSZWYxMDAwRzN2NV9leGNsdWRpbmdDaHIyMXNucF8wLjFfSlJTLnRzdiIpCmBgYAoKCiMgQVJDSElWRSAoTk9UIFJVTikKCgojIyMjIENyZWF0ZSBhIGNvbWJpbmVkIGluZm8gZmlsZQpgYGB7YmFzaH0KY2QgJy9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHMvUmVzdWx0cycKY2F0ICouaW5mby5neiA+PiAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0RBVEFfTUFJTi9NRUdBL0ltcHV0YXRpb25fUmVmMTAwMEczdjUvT3V0L0ltcHV0YXRpb25fUmVzdWx0c19DTEVBTi9hdXRvc29tZXNOb0NocjIxLmluZm8uZ3onCmBgYAoKYGBge3J9Cm5hbWVzKHNucF9saXN0LnNwbGl0KSAjWzFdICIxIiAgIjIiICAiMyIgICI0IiAgIjYiICAiMTAiICIxMSIgIjEyIiAiMTQiICIxNSIgIjE2IiAiMTgiICIyMiIKbGVuZ3RoKHNucF9saXN0LnNwbGl0KSAjWzFdIDEzCgppbXB1dGF0aW9uLmluZm8uR1JTLmNocjEgPC0gaW1wdXRhdGlvbi5pbmZvJGAxYCAlPiUgZmlsdGVyKFNOUCAlaW4lIHNucF9saXN0LnNwbGl0JGAxYCRTTlApCmltcHV0YXRpb24uaW5mby5HUlMuY2hyMiA8LSBpbXB1dGF0aW9uLmluZm8kYDJgICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXQkYDJgJFNOUCkKaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIzIDwtIGltcHV0YXRpb24uaW5mbyRgM2AgJT4lIGZpbHRlcihTTlAgJWluJSBzbnBfbGlzdC5zcGxpdCRgM2AkU05QKQppbXB1dGF0aW9uLmluZm8uR1JTLmNocjQgPC0gaW1wdXRhdGlvbi5pbmZvJGA0YCAlPiUgZmlsdGVyKFNOUCAlaW4lIHNucF9saXN0LnNwbGl0JGA0YCRTTlApCmltcHV0YXRpb24uaW5mby5HUlMuY2hyNiA8LSBpbXB1dGF0aW9uLmluZm8kYDZgICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXQkYDZgJFNOUCkKaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxMCA8LSBpbXB1dGF0aW9uLmluZm8kYDEwYCAlPiUgZmlsdGVyKFNOUCAlaW4lIHNucF9saXN0LnNwbGl0JGAxMGAkU05QKQppbXB1dGF0aW9uLmluZm8uR1JTLmNocjExIDwtIGltcHV0YXRpb24uaW5mbyRgMTFgICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXQkYDExYCRTTlApCmltcHV0YXRpb24uaW5mby5HUlMuY2hyMTIgPC0gaW1wdXRhdGlvbi5pbmZvJGAxMmAgJT4lIGZpbHRlcihTTlAgJWluJSBzbnBfbGlzdC5zcGxpdCRgMTJgJFNOUCkKaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxNCA8LSBpbXB1dGF0aW9uLmluZm8kYDE0YCAlPiUgZmlsdGVyKFNOUCAlaW4lIHNucF9saXN0LnNwbGl0JGAxNGAkU05QKQppbXB1dGF0aW9uLmluZm8uR1JTLmNocjE1IDwtIGltcHV0YXRpb24uaW5mbyRgMTVgICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXQkYDE1YCRTTlApCmltcHV0YXRpb24uaW5mby5HUlMuY2hyMTYgPC0gaW1wdXRhdGlvbi5pbmZvJGAxNmAgJT4lIGZpbHRlcihTTlAgJWluJSBzbnBfbGlzdC5zcGxpdCRgMTZgJFNOUCkKaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxOCA8LSBpbXB1dGF0aW9uLmluZm8kYDE4YCAlPiUgZmlsdGVyKFNOUCAlaW4lIHNucF9saXN0LnNwbGl0JGAxOGAkU05QKQppbXB1dGF0aW9uLmluZm8uR1JTLmNocjIyIDwtIGltcHV0YXRpb24uaW5mbyRgMjJgICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXQkYDIyYCRTTlApCgppbXB1dGF0aW9uLmluZm8uR1JTIDwtIGxpc3QoaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxLAogICAgIGltcHV0YXRpb24uaW5mby5HUlMuY2hyMiwKICAgICBpbXB1dGF0aW9uLmluZm8uR1JTLmNocjMsCiAgICAgaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHI0LAogICAgIGltcHV0YXRpb24uaW5mby5HUlMuY2hyNiwKICAgICBpbXB1dGF0aW9uLmluZm8uR1JTLmNocjEwLAogICAgIGltcHV0YXRpb24uaW5mby5HUlMuY2hyMTEsCiAgICAgaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxMiwKICAgICBpbXB1dGF0aW9uLmluZm8uR1JTLmNocjE0LAogICAgIGltcHV0YXRpb24uaW5mby5HUlMuY2hyMTUsCiAgICAgaW1wdXRhdGlvbi5pbmZvLkdSUy5jaHIxNiwKICAgICBpbXB1dGF0aW9uLmluZm8uR1JTLmNocjE4LAogICAgIGltcHV0YXRpb24uaW5mby5HUlMuY2hyMjIpICU+JQogIGxhcHBseShhcy5kYXRhLmZyYW1lKSAlPiUKICByYmluZGxpc3QoKSAlPiUKICBhcnJhbmdlKFJzcSkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgppbXB1dGF0aW9uLmluZm8uR1JTICU+JSBkaW0oKSAjWzFdIDQzIDEzCgppbXB1dGF0aW9uLmluZm8uR1JTCgpzZXR3ZChkaXIuRGF0YSkKZndyaXRlKGltcHV0YXRpb24uaW5mby5HUlMsICJNRUdBXzA0MTgyMl9FeHRyYWN0ZWRfZnJvbV9JbXB1dGVkUmVmMTAwMEczdjVfTm9DaHIyMV92MC4xX0pSUy5pbmZvLmd6IikKYGBgCgoKCgoKYGBge3J9CmltcHV0ZWQudHJhdzAyIDwtIGltcHV0ZWQudHJhdzAxICU+JQogIGxlZnRfam9pbihpbXB1dGF0aW9uUUNpbmZvLkdSU29yaWcsIGJ5ID0gIkNIUl9QT1MiKSAlPiUKICByZW5hbWUoYElORk8uUkVGKDApYCA9IGBSRUYoMClgLAogICAgICAgICBgSU5GTy5BTFQoMSlgID0gYEFMVCgxKWAsCiAgICAgICAgIElORk8uQUxUX0ZycSA9IEFMVF9GcnEsCiAgICAgICAgIElORk8uTUFGID0gTUFGLAogICAgICAgICBJTkZPLkF2Z0NhbGwgPSBBdmdDYWxsLAogICAgICAgICBJTkZPLlJzcSA9IFJzcSwKICAgICAgICAgSU5GTy5HZW5vdHlwZWQgPSBHZW5vdHlwZWQsCiAgICAgICAgIElORk8uTG9vUnNxID0gTG9vUnNxLAogICAgICAgICBJTkZPLkVtcFIgPSBFbXBSLAogICAgICAgICBJTkZPLkVtcFJzcSA9IEVtcFJzcSwKICAgICAgICAgSU5GTy5Eb3NlMCA9IERvc2UwLAogICAgICAgICBJTkZPLkRvc2UxID0gRG9zZTEpCgppbXB1dGVkLnRyYXcwMgpgYGAKCgpgYGB7cn0Kb3JpZ2luYWxHUlMubm9uSExBRFEuZG9zYWdlLklORk8gPC0gaW1wdXRlZC50cmF3MDIgJT4lIGZpbHRlcihJbl9PcmlnaW5hbF9HUlMgPT0gMSkgJT4lCiAgc2VsZWN0KC1jKEluX09yaWdpbmFsX0dSUywgSW5fUmV2aXNlZF9HUlMsIEV4dHJhY3RlZCkpICU+JQogIHNlbGVjdChJSUQsIENIUiwgUE9TLCBTTlAsIENPVU5URUQsIEFMVCwgRG9zYWdlLkNPVU5URUQsIGV2ZXJ5dGhpbmcoKSkgJT4lCiAgYXJyYW5nZShJTkZPLlJzcSkKCnJldmlzZWRHUlMuZG9zYWdlLklORk8gPC0gaW1wdXRlZC50cmF3MDIgJT4lIGZpbHRlcihJbl9SZXZpc2VkX0dSUyA9PSAxKSAlPiUKICBzZWxlY3QoLWMoSW5fT3JpZ2luYWxfR1JTLCBJbl9SZXZpc2VkX0dSUywgRXh0cmFjdGVkKSkgJT4lCiAgc2VsZWN0KElJRCwgQ0hSLCBQT1MsIFNOUCwgQ09VTlRFRCwgQUxULCBEb3NhZ2UuQ09VTlRFRCwgZXZlcnl0aGluZygpKSAlPiUKICBhcnJhbmdlKElORk8uUnNxKQoKb3JpZ2luYWxHUlMubm9uSExBRFEuSU5GTyA8LSBvcmlnaW5hbEdSUy5ub25ITEFEUS5kb3NhZ2UuSU5GTyAlPiUgc2VsZWN0KC1jKElJRCwgRG9zYWdlLkNPVU5URUQpKSAlPiUgdW5pcXVlKCkKcmV2aXNlZEdSUy5JTkZPIDwtIHJldmlzZWRHUlMuZG9zYWdlLklORk8gJT4lIHNlbGVjdCgtYyhJSUQsIERvc2FnZS5DT1VOVEVEKSkgJT4lIHVuaXF1ZSgpCgpvcmlnaW5hbEdSUy5ub25ITEFEUS5kb3NhZ2UuSU5GTwpyZXZpc2VkR1JTLmRvc2FnZS5JTkZPCgpvcmlnaW5hbEdSUy5ub25ITEFEUS5JTkZPCnJldmlzZWRHUlMuSU5GTwpgYGAKCiMjIyMgTWFrZSBhIGRhdGFmcmFtZSBvZiB0aGUgaW1wdXRhdGlvbiBxdWFsaXR5IHN0YXRpc3RpY3MgZm9yIHRoZSBub24tSExBLURRIFNOUHMgaW4gdGhlIG9yaWdpbmFsbHktcHVibGlzaGVkIEdSUwpgYGB7cn0KSU5GTy5ub25ITEFEUS5vcmlnR1JTIDwtIGFubm8ubm9uSExBRFEub3JpZ0dSUyAlPiUKICBmaWx0ZXIoZ3JlcGwoIl8iLCBjaHJvbSk9PUZBTFNFKSAlPiUKICBzZWxlY3QobmFtZSwgY2hyb20sIGNocm9tRW5kKSAlPiUKICByZW5hbWUoR1JTX3JzSUQgPSBuYW1lLCBDSFIgPSBjaHJvbSwgUE9TID0gY2hyb21FbmQpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBtdXRhdGUoQ0hSID0gYXMuY2hhcmFjdGVyKENIUiksCiAgICAgICAgIENIUiA9IGdzdWIoImNociIsICIiLCBDSFIpLAogICAgICAgICBQT1MgPSBhcy5jaGFyYWN0ZXIoUE9TKSkgJT4lCiAgZnVsbF9qb2luKG9yaWdpbmFsR1JTLm5vbkhMQURRLklORk8gJT4lCiAgICAgICAgICAgICAgbXV0YXRlKENIUiA9IGFzLmNoYXJhY3RlcihDSFIpLCBQT1MgPSBhcy5jaGFyYWN0ZXIoUE9TKSksCiAgICAgICAgICAgIGJ5ID0gYygiQ0hSIiwgIlBPUyIpKQoKSU5GTy5ub25ITEFEUS5vcmlnR1JTCmBgYAoKIyMjIyBNYWtlIGEgZGF0YWZyYW1lIG9mIHRoZSBpbXB1dGF0aW9uIHF1YWxpdHkgc3RhdGlzdGljcyBmb3IgU05QcyBpbiB0aGUgcmV2aXNlZCBHUlMKYGBge3J9CklORk8ucmV2aXNlZEdSUyA8LSBhbm5vLnJldmlzZWRHUlMgJT4lCiAgc2VwYXJhdGUoUE9TSVRJT05fREJTTlAxNTEsIGludG8gPSBjKCJDSFIiLCAiUE9TIiksIHNlcCA9ICI6IiwgZXh0cmEgPSAibWVyZ2UiLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KFJTSUQsIENIUiwgUE9TKSAlPiUKICB1bmlxdWUoKSAlPiUKICByZW5hbWUoR1JTX3JzSUQgPSBSU0lEKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlKENIUiA9IGFzLmNoYXJhY3RlcihDSFIpLAogICAgICAgICBQT1MgPSBhcy5jaGFyYWN0ZXIoUE9TKSkgJT4lCiAgZnVsbF9qb2luKHJldmlzZWRHUlMuSU5GTyAlPiUKICAgICAgICAgICAgICBtdXRhdGUoQ0hSID0gYXMuY2hhcmFjdGVyKENIUiksIFBPUyA9IGFzLmNoYXJhY3RlcihQT1MpKSwKICAgICAgICAgICAgYnkgPSBjKCJDSFIiLCAiUE9TIikpCgpJTkZPLnJldmlzZWRHUlMKYGBgCgpgYGB7cn0KSU5GTy5ub25ITEFEUS5vcmlnR1JTCklORk8ucmV2aXNlZEdSUwoKc2V0d2QoZGlyLkRhdGEpCmZ3cml0ZShJTkZPLm5vbkhMQURRLm9yaWdHUlMsICJNRUdBXzA0MTgxMl9JbXB1dGF0aW9uSU5GT19PcmlnaW5hbEdSU19ub25ITEFEUXNucHNfdjAuMV9KUlMuY3N2IikKZndyaXRlKElORk8ucmV2aXNlZEdSUywgIk1FR0FfMDQxODEyX0ltcHV0YXRpb25JTkZPX1JldmlzZWRHUlNfdjAuMV9KUlMuY3N2IikKYGBgCgoKCiMjIyMgU2V0dGluZyBhbmQgbW9kaWZ5aW5nIHRoZW1lIGZvciBwbG90cwpgYGB7cn0KdGhlbWVfc2V0KHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMTIsIGJhc2VfZmFtaWx5ID0gIkFyaWFsIikgKwogICAgICAgICAgICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyPSJibGFjayIsIGZpbGwgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgaGp1c3QgPSAwKSwgIyBsaW5laGVpZ2h0PS44LCBzaXplPTIwLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgc2l6ZSA9IDExKSwgI3NpemUgPSAxNAogICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gTlVMTCksCiAgICAgICAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyPSJibGFjayIsIGZpbGwgPSAibGlnaHQgZ3JleSIsIHNpemUgPSAxKSwgIyBhZGp1c3RzIGZhY2V0IGxhYmVsIGJvcmRlcnMgKGlmIGFueSkKICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKQogICAgICAgICAgKSkKUmVkQmx1ZSA8LSBjKCIjQ0QzMzMzIiwgIiMxODc0Q0QiKQpHcmF5Qmx1ZSA8LSBjKCJncmV5IiwgIiMyYjhjYmUiKQpgYGAKCiMjIyMgTWFrZSBJTkZPIHBsb3QgZGF0YQpgYGB7cn0KcGxvdERhdGEuSU5GTy5ub25ITEFEUS5vcmlnR1JTIDwtIElORk8ubm9uSExBRFEub3JpZ0dSUyAlPiUKICBzZWxlY3QoR1JTX3JzSUQsIFNOUCwgSU5GTy5Sc3EsIElORk8uRW1wUnNxLCBJTkZPLk1BRikgJT4lCiAgdW5pcXVlKCkgJT4lCiAgbXV0YXRlKHBsb3ROYW1lID0gcGFzdGUoR1JTX3JzSUQsICIgKCIsIFNOUCwgIikiLCBzZXAgPSAiIikpICU+JQogIHNlbGVjdChwbG90TmFtZSwgZXZlcnl0aGluZygpKSAlPiUKICBtdXRhdGUoSU5GTy5Sc3EgPSBhcy5udW1lcmljKElORk8uUnNxKSkgJT4lCiAgYXJyYW5nZShJTkZPLlJzcSkgJT4lCiAgIyBGaWx0ZXIgb3V0IHRoZSBHUlMgU05QIGxvY2F0ZWQgb24gQ2hyb21vc29tZSAyMToKICBmaWx0ZXIoR1JTX3JzSUQgIT0gInJzMTg5MzU5MiIpCgpwbG90RGF0YS5JTkZPLnJldmlzZWRHUlMgPC0gSU5GTy5yZXZpc2VkR1JTICU+JQogIHNlbGVjdChHUlNfcnNJRCwgU05QLCBJTkZPLlJzcSwgSU5GTy5FbXBSc3EsIElORk8uTUFGKSAlPiUKICB1bmlxdWUoKSAlPiUKICBtdXRhdGUocGxvdE5hbWUgPSBwYXN0ZShHUlNfcnNJRCwgIiAoIiwgU05QLCAiKSIsIHNlcCA9ICIiKSkgJT4lCiAgc2VsZWN0KHBsb3ROYW1lLCBldmVyeXRoaW5nKCkpICU+JQogIG11dGF0ZShJTkZPLlJzcSA9IGFzLm51bWVyaWMoSU5GTy5Sc3EpKSAlPiUKICBhcnJhbmdlKElORk8uUnNxKSAlPiUKICAjIEZpbHRlciBvdXQgdGhlIEdSUyBTTlAgbG9jYXRlZCBvbiBDaHJvbW9zb21lIDIxOgogIGZpbHRlcihHUlNfcnNJRCAhPSAicnMxODkzNTkyIikKCnBsb3REYXRhLklORk8ubm9uSExBRFEub3JpZ0dSUwpwbG90RGF0YS5JTkZPLnJldmlzZWRHUlMKYGBgCgojIyMjIE1ha2UgYmFycGxvdHMgb2YgUnNxCmBgYHtyfQpwbG90Lm5vbkhMQURRLm9yaWdHUlMuUnNxIDwtIHBsb3REYXRhLklORk8ubm9uSExBRFEub3JpZ0dSUyAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBsb3ROYW1lLCBJTkZPLlJzcSksIHkgPSBJTkZPLlJzcSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICAjY29sb3IgPSBHcmF5Qmx1ZVtbMV1dLAogICAgICAgICAgIGZpbGwgPSBHcmF5Qmx1ZVtbMV1dKSArCiAgY29vcmRfZmxpcCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImRvZGdlcmJsdWUzIikgKwogIGxhYnModGl0bGUgPSAiRXN0aW1hdGVkIGNvcnJlbGF0aW9uIG9mIGltcHV0ZWQgZ2Vub3R5cGVzIGFuZCB0cnVlLCB1bm9ic2VydmVkIGdlbm90eXBlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJPcmlnaW5hbCBHUlMgKDIwMTkpLCBub24tSExBLURRIFNOUHMgb25seSIsCiAgICAgICBjYXB0aW9uID0gJ1JzcTogIlRoZSBlc3RpbWF0ZWQgdmFsdWUgb2YgdGhlIHNxdWFyZWQgY29ycmVsYXRpb24gYmV0d2VlbiBpbXB1dGVkIGdlbm90eXBlcyBhbmQgdHJ1ZSwgdW5vYnNlcnZlZCBnZW5vdHlwZXMiXG4oaHR0cHM6Ly9nZW5vbWUuc3BoLnVtaWNoLmVkdS93aWtpL01pbmltYWMzX0luZm9fRmlsZSkuJykgKwogIHlsYWIoIlJzcSIpICsKICB4bGFiKCIiKSArCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMC45KQoKcGxvdC5yZXZpc2VkR1JTLlJzcSA8LSBwbG90RGF0YS5JTkZPLnJldmlzZWRHUlMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihwbG90TmFtZSwgSU5GTy5Sc3EpLCB5ID0gSU5GTy5Sc3EpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgI2NvbG9yID0gR3JheUJsdWVbWzFdXSwKICAgICAgICAgICBmaWxsID0gR3JheUJsdWVbWzFdXSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJkb2RnZXJibHVlMyIpICsKICBsYWJzKHRpdGxlID0gIkVzdGltYXRlZCBjb3JyZWxhdGlvbiBvZiBpbXB1dGVkIGdlbm90eXBlcyBhbmQgdHJ1ZSwgdW5vYnNlcnZlZCBnZW5vdHlwZXMiLAogICAgICAgc3VidGl0bGUgPSAiUmV2aXNlZCBHUlMgKDIwMjIpIiwKICAgICAgIGNhcHRpb24gPSAnUnNxOiAiVGhlIGVzdGltYXRlZCB2YWx1ZSBvZiB0aGUgc3F1YXJlZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGltcHV0ZWQgZ2Vub3R5cGVzIGFuZCB0cnVlLCB1bm9ic2VydmVkIGdlbm90eXBlcyJcbihodHRwczovL2dlbm9tZS5zcGgudW1pY2guZWR1L3dpa2kvTWluaW1hYzNfSW5mb19GaWxlKS4nKSArCiAgeWxhYigiUnNxIikgKwogIHhsYWIoIiIpICsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAwLjkpCgpwbG90Lm5vbkhMQURRLm9yaWdHUlMuUnNxCnBsb3QucmV2aXNlZEdSUy5Sc3EKCmZpbGVuYW1lIDwtICJNRUdBXzA0MTgyMl9QbG90X0ltcHV0YXRpb25fUnNxX09yaWdHUlNfbm9uSExBRFFfdjAuMV9KUlMiCnNldHdkKGRpci5QbG90cykKZ2dzYXZlKHBsb3QgPSBwbG90Lm5vbkhMQURRLm9yaWdHUlMuUnNxLAogICAgICAgZmlsZW5hbWUgPSBwYXN0ZShmaWxlbmFtZSwgIi5wbmciLCBzZXAgPSAiIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIpCnNldHdkKGRpci5QbG90cykKZ2dzYXZlKHBsb3QgPSBwbG90Lm5vbkhMQURRLm9yaWdHUlMuUnNxLAogICAgICAgZmlsZW5hbWUgPSBwYXN0ZShmaWxlbmFtZSwgIi5wZGYiLCBzZXAgPSAiIiksIGRldmljZSA9IGNhaXJvX3BkZiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImluIikKCmZpbGVuYW1lIDwtICJNRUdBXzA0MTgyMl9QbG90X0ltcHV0YXRpb25fUnNxX1JldmlzZWRHUlNfdjAuMV9KUlMiCnNldHdkKGRpci5QbG90cykKZ2dzYXZlKHBsb3QgPSBwbG90LnJldmlzZWRHUlMuUlNRLAogICAgICAgZmlsZW5hbWUgPSBwYXN0ZShmaWxlbmFtZSwgIi5wbmciLCBzZXAgPSAiIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJpbiIpCnNldHdkKGRpci5QbG90cykKZ2dzYXZlKHBsb3QgPSBwbG90LnJldmlzZWRHUlMuUlNRLAogICAgICAgZmlsZW5hbWUgPSBwYXN0ZShmaWxlbmFtZSwgIi5wZGYiLCBzZXAgPSAiIiksIGRldmljZSA9IGNhaXJvX3BkZiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImluIikKYGBgCgoKCiMjIyMgTWFrZSBiYXJwbG90cyBvZiBlbXBpcmljYWwgUnNxCmBgYHtyfQpwbG90RGF0YS5JTkZPLm5vbkhMQURRLm9yaWdHUlMgJT4lIG5yb3coKQpwbG90RGF0YS5JTkZPLm5vbkhMQURRLm9yaWdHUlMgJT4lIGZpbHRlcihJTkZPLkVtcFJzcSAhPSAiLSIpICU+JSBucm93KCkKCnBsb3Qubm9uSExBRFEub3JpZ0dSUy5FbXBSc3EgPC0gcGxvdERhdGEuSU5GTy5ub25ITEFEUS5vcmlnR1JTICU+JQogIGZpbHRlcihJTkZPLkVtcFJzcSAhPSAiLSIpICU+JQogIG11dGF0ZShJTkZPLkVtcFJzcSA9IGFzLm51bWVyaWMoSU5GTy5FbXBSc3EpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBsb3ROYW1lLCBJTkZPLkVtcFJzcSksIHkgPSBJTkZPLkVtcFJzcSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICAjY29sb3IgPSBHcmF5Qmx1ZVtbMV1dLAogICAgICAgICAgIGZpbGwgPSBHcmF5Qmx1ZVtbMV1dKSArCiAgY29vcmRfZmxpcCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImRvZGdlcmJsdWUzIikgKwogIGxhYnModGl0bGUgPSAiRXN0aW1hdGVkIGNvcnJlbGF0aW9uIG9mIGltcHV0ZWQgZ2Vub3R5cGVzIGFuZCB0cnVlLCBvYnNlcnZlZCBnZW5vdHlwZXMiLAogICAgICAgc3VidGl0bGUgPSAiT3JpZ2luYWwgR1JTICgyMDE5KSwgb2JzZXJ2ZWQgbm9uLUhMQS1EUSBTTlBzIG9ubHkiLAogICAgICAgY2FwdGlvbiA9ICdFbXBSc3E6IFRoZSBlc3RpbWF0ZWQgc3F1YXJlZCBjb3JyZWxhdGlvbiAiYmV0d2VlbiB0aGUgdHJ1ZSBnZW5vdHlwZWQgdmFsdWVzIGFuZCB0aGUgaW1wdXRlZCBkb3NhZ2VzIHRoYXQgd2VyZSBjYWxjdWxhdGVkIGJ5IGhpZGluZyBhbGwga25vd24gZ2Vub3R5cGVkIGZvciB0aGUgZ2l2ZW4gU05QIlxuKGh0dHBzOi8vZ2Vub21lLnNwaC51bWljaC5lZHUvd2lraS9NaW5pbWFjM19JbmZvX0ZpbGUpLicpICsKICB5bGFiKCJFbXBSc3EiKSArCiAgeGxhYigiIikgKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDAuOSkKCnBsb3QucmV2aXNlZEdSUy5FbXBSc3EgPC0gcGxvdERhdGEuSU5GTy5yZXZpc2VkR1JTICU+JQogIGZpbHRlcihJTkZPLkVtcFJzcSAhPSAiLSIpICU+JQogIG11dGF0ZShJTkZPLkVtcFJzcSA9IGFzLm51bWVyaWMoSU5GTy5FbXBSc3EpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHBsb3ROYW1lLCBJTkZPLkVtcFJzcSksIHkgPSBJTkZPLkVtcFJzcSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICAjY29sb3IgPSBHcmF5Qmx1ZVtbMV1dLAogICAgICAgICAgIGZpbGwgPSBHcmF5Qmx1ZVtbMV1dKSArCiAgY29vcmRfZmxpcCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImRvZGdlcmJsdWUzIikgKwogIGxhYnModGl0bGUgPSAiRXN0aW1hdGVkIGNvcnJlbGF0aW9uIG9mIGltcHV0ZWQgZ2Vub3R5cGVzIGFuZCB0cnVlLCBvYnNlcnZlZCBnZW5vdHlwZXMiLAogICAgICAgc3VidGl0bGUgPSAiUmV2aXNlZCBHUlMgKDIwMjIpLCBvYnNlcnZlZCBTTlBzIG9ubHkiLAogICAgICAgY2FwdGlvbiA9ICdFbXBSc3E6IFRoZSBlc3RpbWF0ZWQgc3F1YXJlZCBjb3JyZWxhdGlvbiAiYmV0d2VlbiB0aGUgdHJ1ZSBnZW5vdHlwZWQgdmFsdWVzIGFuZCB0aGUgaW1wdXRlZCBkb3NhZ2VzIHRoYXQgd2VyZSBjYWxjdWxhdGVkIGJ5IGhpZGluZyBhbGwga25vd24gZ2Vub3R5cGVkIGZvciB0aGUgZ2l2ZW4gU05QIlxuKGh0dHBzOi8vZ2Vub21lLnNwaC51bWljaC5lZHUvd2lraS9NaW5pbWFjM19JbmZvX0ZpbGUpLicpICsKICB5bGFiKCJFbXBSc3EiKSArCiAgeGxhYigiIikgKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDApLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDAuOSkKCnBsb3Qubm9uSExBRFEub3JpZ0dSUy5FbXBSc3EKcGxvdC5yZXZpc2VkR1JTLkVtcFJzcQoKZmlsZW5hbWUgPC0gIk1FR0FfMDQxNDIyX1Bsb3RfSW1wdXRhdGlvbl9FbXBSc3FfT3JpZ0dSU19ub25ITEFEUV92MC4xX0pSUyIKc2V0d2QoZGlyLlBsb3RzKQpnZ3NhdmUocGxvdCA9IHBsb3Qubm9uSExBRFEub3JpZ0dSUy5FbXBSc3EsCiAgICAgICBmaWxlbmFtZSA9IHBhc3RlKGZpbGVuYW1lLCAiLnBuZyIsIHNlcCA9ICIiKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImluIikKc2V0d2QoZGlyLlBsb3RzKQpnZ3NhdmUocGxvdCA9IHBsb3Qubm9uSExBRFEub3JpZ0dSUy5FbXBSc3EsCiAgICAgICBmaWxlbmFtZSA9IHBhc3RlKGZpbGVuYW1lLCAiLnBkZiIsIHNlcCA9ICIiKSwgZGV2aWNlID0gY2Fpcm9fcGRmLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiaW4iKQoKZmlsZW5hbWUgPC0gIk1FR0FfMDQxNDIyX1Bsb3RfSW1wdXRhdGlvbl9FbXBSc3FfUmV2aXNlZEdSU192MC4xX0pSUyIKc2V0d2QoZGlyLlBsb3RzKQpnZ3NhdmUocGxvdCA9IHBsb3QucmV2aXNlZEdSUy5FbXBSc3EsCiAgICAgICBmaWxlbmFtZSA9IHBhc3RlKGZpbGVuYW1lLCAiLnBuZyIsIHNlcCA9ICIiKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTAsIHVuaXRzID0gImluIikKc2V0d2QoZGlyLlBsb3RzKQpnZ3NhdmUocGxvdCA9IHBsb3QucmV2aXNlZEdSUy5FbXBSc3EsCiAgICAgICBmaWxlbmFtZSA9IHBhc3RlKGZpbGVuYW1lLCAiLnBkZiIsIHNlcCA9ICIiKSwgZGV2aWNlID0gY2Fpcm9fcGRmLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCwgdW5pdHMgPSAiaW4iKQpgYGAKCiMjIyMgTWFrZSBhIHNpbXBsZSB0ZXh0IGZpbGUgdGhhdCBsaXN0cyBhbGwgb2YgdGhlIEdSUyByc0lEcwpgYGB7cn0KZ3JzX3JzSURzLm9yaWcgPC0gcmJpbmQoc2hhcnBTMSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoYEhMQS1EUS5oYXBsb3R5cGVgLCBTTlAxLCBTTlAyKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoSExBX0RRX2hhcGxvdHlwZSA9IGBITEEtRFEuaGFwbG90eXBlYCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9ICJrZXkiLCB2YWx1ZSA9ICJ2YWx1ZSIsIFNOUDE6U05QMikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKFNOUF9pbmRleCA9IGdzdWIoIlNOUCIsICIiLCBrZXkpICU+JSBhcy5udW1lcmljKCkpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZShHUlNfcnNJRCA9IHZhbHVlKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoSExBX0RRX2hhcGxvdHlwZSwgU05QX2luZGV4LCBHUlNfcnNJRCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYW5nZShITEFfRFFfaGFwbG90eXBlKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoR1JTX3JzSUQpLAogICAgICAgICAgICAgICAgICAgICAgICBhbm5vLm5vbkhMQURRLm9yaWdHUlMgJT4lIHNlbGVjdChuYW1lKSAlPiUgcmVuYW1lKEdSU19yc0lEID0gbmFtZSkgJT4lIGFzLmRhdGEuZnJhbWUoKSkgJT4lCiAgdW5pcXVlKCkKCmdyc19yc0lEcy5yZXZpc2VkIDwtIGFubm8ucmV2aXNlZEdSUyAlPiUKICBzZWxlY3QoUlNJRCkgJT4lCiAgcmVuYW1lKEdSU19yc0lEID0gUlNJRCkgJT4lCiAgdW5pcXVlKCkKCmdyc19yc0lEcy5vcmlnX3JldmlzZWQgPC0gcmJpbmQoZ3JzX3JzSURzLm9yaWcsIGdyc19yc0lEcy5yZXZpc2VkKSAlPiUKICB1bmlxdWUoKQoKZ3JzX3JzSURzLm9yaWcKZ3JzX3JzSURzLnJldmlzZWQKZ3JzX3JzSURzLm9yaWdfcmV2aXNlZAoKc2V0d2QoZGlyLkRhdGEpCmZ3cml0ZShncnNfcnNJRHMub3JpZ19yZXZpc2VkLCAiTUVHQV8wNDE4MjJfcnNJRHNfR1JTb3JpZ2luYWxfR1JTcmV2aXNlZF92MC4xX0pSUy50eHQiLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UpCmZ3cml0ZShncnNfcnNJRHMub3JpZywgIk1FR0FfMDQxODIyX3JzSURzX0dSU29yaWdpbmFsX3YwLjFfSlJTLnR4dCIsIHNlcCA9ICJcdCIsIGNvbC5uYW1lcyA9IEZBTFNFLCByb3cubmFtZXMgPSBGQUxTRSwgcXVvdGUgPSBGQUxTRSkKZndyaXRlKGdyc19yc0lEcy5yZXZpc2VkLCAiTUVHQV8wNDE4MjJfcnNJRHNfR1JTcmV2aXNlZF92MC4xX0pSUy50eHQiLCBzZXAgPSAiXHQiLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UsIHF1b3RlID0gRkFMU0UpCmBgYAoKCmBgYHtyfQpncnNfcnNJRHMub3JpZyRHUlNfcnNJRCAlPiUgcGFzdGUoY29sbGFwc2UgPSAiLCIpCmBgYAoKYGBge3J9Cmdyc19yc0lEcy5yZXZpc2VkJEdSU19yc0lEICU+JSBwYXN0ZShjb2xsYXBzZSA9ICIsIikKYGBgCgojIyMjIFVzZSB0aGUgc3RyaW5ncyBwcm9kdWNlZCBhYm92ZSB0byBzZWFyY2ggR1JBU1AgYW5kIEhhcGxvUmVnCmh0dHBzOi8vcHVicy5icm9hZGluc3RpdHV0ZS5vcmcvbWFtbWFscy9oYXBsb3JlZy9oYXBsb3JlZy5waHAKaHR0cHM6Ly9ncmFzcC5uaGxiaS5uaWguZ292L1NlYXJjaC5hc3B4CmBgYHtyfQpxdWVyeS5HUlNvcmlnIDwtIGMoInJzMTA0OTEyNCIsInJzNzc3NTIyOCIsInJzMjE4NzY2OCIsInJzMTYxNzMyMiIsInJzNzM0MDU0NzEiLCJyczc5NTUwMjM5IiwicnM3NDU0MTA4IiwicnMzOTU3MTQ2IiwicnMxMDgwMDc0NiIsInJzMTIwNjg2NzEiLCJyczEyMTQyMjgwIiwKICAgICAgICAgICAgICAgICAgICJyczEzNTkwNjIiLCJyczQ0NDU0MDYiLCJyczEwMTY3NjUwIiwicnMxMDE4MzI2IiwicnMxMzAwMzQ2NCIsInJzMTk4MDQyMiIsInJzNjcxNTEwNiIsInJzOTkwMTcxIiwicnMxMzUzMjQ4IiwicnMyMDMwNTE5IiwicnMyNTYxMjg4IiwKICAgICAgICAgICAgICAgICAgICJyczYxNTc5MDIyIiwicnM3NjE2MjE1IiwicnMxMzEzMjMwOCIsInJzMTA1MDk3NiIsInJzMTYxMTcxMCIsInJzMTcyNjQzMzIiLCJyczE4MjQyOSIsInJzMjMwMTIyNiIsInJzMzEyODkyNyIsInJzNDE0MzMzMiIsInJzNTU3NDM5MTQiLAogICAgICAgICAgICAgICAgICAgInJzNjkzNzA2MSIsInJzMTI1MDU1MiIsInJzMjM4NzM5NyIsInJzMTA4OTIyNTgiLCJyczYxOTA3NzY1IiwicnM3MTA0NzkxIiwicnMzMTg0NTA0IiwicnMxMTg1MTQxNCIsInJzMTM3ODkzOCIsInJzNjQ5ODExNCIsInJzMTE4NzU2ODciLAogICAgICAgICAgICAgICAgICAgInJzMTg5MzU5MiIsInJzNDgyMTEyNCIpCgpxdWVyeS5HUlNyZXZpc2VkIDwtIGMoInJzMTA0OTEyNCIsInJzMjE4NzY2OCIsInJzNzM0MDU0NzEiLCJyczkyNzU0MzciLCJyczQxNDMzMzIiLCJyczMxMjg5MjciLCJyczIzMDEyMjYiLCJyczY5MzcwNjEiLCJyczE2MTE3MTAiLCJyczEzMTMyMzA4IiwicnMyMDMwNTE5IiwKICAgICAgICAgICAgICAgICAgICAgICJyczEzMjMyOTIiLCJyczE3MjY0MzMyIiwicnM2NzE1MTA2IiwicnM1NTc0MzkxNCIsInJzOTkwMTcxIiwicnMxOTgwNDIyIiwicnMzMTg0NTA0IiwicnM2MTkwNzc2NSIsInJzMTMwMDM0NjQiLCJyczExODc1Njg3IiwicnMxMjA2ODY3MSIsCiAgICAgICAgICAgICAgICAgICAgICAicnMxMjUwNTUyIiwicnMxMDg5MjI1OCIsInJzMTAxODMyNiIsInJzMTgyNDI5IiwicnM3MTA0NzkxIiwicnM0ODIxMTI0IiwicnM0NDQ1NDA2IiwicnMxMTgwMTE4MyIsInJzNjQ5ODExNCIsInJzMTM1MzI0OCIsInJzOTQ3NDc0IiwKICAgICAgICAgICAgICAgICAgICAgICJyczE4OTM1OTIiLCJyczExODUxNDE0IiwicnMxMzc4OTM4IiwicnMxMDgwMDc0NiIsInJzMTA1MDk3NiIsInJzNzYxNjIxNSIsInJzMjU2MTI4OCIsInJzNjE1NzkwMjIiLCJyczEwMTY3NjUwIikKcXVlcnkuR1JTb3JpZwpxdWVyeS5HUlNyZXZpc2VkCgojaW5zdGFsbC5wYWNrYWdlcygiaGFwbG9SIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKbGlicmFyeShoYXBsb1IpCnF1ZXJ5SGFwbG9SZWcuR1JTb3JpZyA8LSBxdWVyeUhhcGxvcmVnKHF1ZXJ5ID0gcXVlcnkuR1JTb3JpZywgdXJsID0gImh0dHBzOi8vcHVicy5icm9hZGluc3RpdHV0ZS5vcmcvbWFtbWFscy9oYXBsb3JlZy9oYXBsb3JlZy5waHAiKQpxdWVyeUhhcGxvUmVnLkdSU3JldmlzZWQgPC0gcXVlcnlIYXBsb3JlZyhxdWVyeSA9IHF1ZXJ5LkdSU3JldmlzZWQsIHVybCA9ICJodHRwczovL3B1YnMuYnJvYWRpbnN0aXR1dGUub3JnL21hbW1hbHMvaGFwbG9yZWcvaGFwbG9yZWcucGhwIikKcXVlcnlIYXBsb1JlZy5HUlNvcmlnCnF1ZXJ5SGFwbG9SZWcuR1JTcmV2aXNlZAoKc2V0d2QoZGlyLkdSU2Fubm8pCmZ3cml0ZShxdWVyeUhhcGxvUmVnLkdSU29yaWcsICIwNDE0MjJfSGFwbG9SZWdfR1JTb3JpZ2luYWxfdjAuMV9KUlMudHh0IikKZndyaXRlKHF1ZXJ5SGFwbG9SZWcuR1JTcmV2aXNlZCwgIjA0MTQyMl9IYXBsb1JlZ19HUlNyZXZpc2VkX3YwLjFfSlJTLnR4dCIpCmBgYAoKCmBgYHtyfQpwd2QKd2dldCAnaHR0cHM6Ly9wdWJzLmJyb2FkaW5zdGl0dXRlLm9yZy9tYW1tYWxzL2hhcGxvcmVnL2hhcGxvcmVnLnBocCcKCmxpYnJhcnkoWE1MKQpsaWJyYXJ5KGh0dHIpCgp0aGV1cmwgPC0gJ2h0dHBzOi8vcHVicy5icm9hZGluc3RpdHV0ZS5vcmcvbWFtbWFscy9oYXBsb3JlZy9oYXBsb3JlZy5waHAnCmRvYyA8LSBodG1sUGFyc2UoR0VUKHRoZXVybCwgdXNlcl9hZ2VudCgiQ2hyb21lIikpKQpyZXN1bHRzIDwtIHhwYXRoU0FwcGx5KGRvYywgIi8vKi90YWJsZVtAaWQ9J3RhYmxlX3Jlc3VsdHNfcl8xJ10iKQpyZXN1bHRzIDwtIHJlYWRIVE1MVGFibGUocmVzdWx0c1tbMV1dKQpybShkb2MpCgoKbGlicmFyeShYTUwpCmxpYnJhcnkoUkN1cmwpCmxpYnJhcnkocmxpc3QpCnRoZXVybCA8LSBnZXRVUkwoImh0dHBzOi8vcHVicy5icm9hZGluc3RpdHV0ZS5vcmcvbWFtbWFscy9oYXBsb3JlZy9oYXBsb3JlZy5waHAiLC5vcHRzID0gbGlzdChzc2wudmVyaWZ5cGVlciA9IEZBTFNFKSApCnRhYmxlcyA8LSByZWFkSFRNTFRhYmxlKHRoZXVybCkKdGFibGVzIDwtIGxpc3QuY2xlYW4odGFibGVzLCBmdW4gPSBpcy5udWxsLCByZWN1cnNpdmUgPSBGQUxTRSkKbi5yb3dzIDwtIHVubGlzdChsYXBwbHkodGFibGVzLCBmdW5jdGlvbih0KSBkaW0odClbMV0pKQoKdGFibGVzCmBgYAoKYGBge3J9CnNldHdkKCIvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvQW5ub3RhdGlvbiIpCmhhcGxvcmVnLkdSU29yaWc8LSBmcmVhZCgiMDQxNDIyX0hhcGxvUmVnX0dSU29yaWdpbmFsX3YwLjFfSlJTLnR4dCIsIGZpbGwgPSBUUlVFKQpoYXBsb3JlZy5HUlNyZXZpc2VkIDwtIGZyZWFkKCIwNDE0MjJfSGFwbG9SZWdfR1JTcmV2aXNlZF92MC4xX0pSUy50eHQiLCBmaWxsID0gVFJVRSkKR1JBU1AuR1JTb3JpZyA8LSByZWFkLnhsc3goIjA0MTQyMl9HUkFTUHNlYXJjaF9HUlNvcmlnaW5hbF92MC4xX0pSUy54bHN4IikKR1JBU1AuR1JTcmV2aXNlZCA8LSByZWFkLnhsc3goIjA0MTQyMl9HUkFTUHNlYXJjaF9HUlNyZXZpc2VkX3YwLjFfSlJTLnhsc3giKQoKdGVzdCA8LSBmcmVhZCgiL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0Fubm90YXRpb24vMDQxNDIyX0hhcGxvUmVnX0dSU29yaWdpbmFsX0RRQjFfdjAuMV9KUlMudHh0Iiwgc2VwID0gIlx0IiwgZmlsbCA9IFRSVUUpCnRlc3QKCmhhcGxvcmVnLkdSU29yaWcKaGFwbG9yZWcuR1JTcmV2aXNlZApHUkFTUC5HUlNvcmlnCkdSQVNQLkdSU3JldmlzZWQKYGBgCgoKCgojIEFSQ0hJVkUKYGBge3J9CnBsb3REYXRhLklORk8ucmV2aXNlZEdSUyAlPiUKICBmaWx0ZXIoSU5GTy5FbXBSc3EgIT0gIi0iKQpgYGAKCgoKCmBgYHtyfQoKCm5hbWVzKGltcHV0YXRpb24uaW5mbylbWzFdXQppbXB1dGF0aW9uLmluZm9bWzFdXQoKbmFtZXMoc25wX2xpc3Quc3BsaXQpW1sxXV0Kc25wX2xpc3Quc3BsaXRbWzFdXQoKbmFtZXMoc25wX2xpc3Quc3BsaXQpICU+JSBsZW5ndGgoKQppbXB1dGF0aW9uLmluZm8gJT4lIGxlbmd0aCgpCgojaW1wdXRhdGlvbi5pbmZvLkdSUyA8LSBsaXN0KCkKI2ZvciAoIGkgaW4gMTpjKHNlcSgxOjIwKSwyMikpIHsKICAjaW1wdXRhdGlvbi5pbmZvLkdSU1tbaV1dIDwtIGltcHV0YXRpb24uaW5mbyRgMWAgJT4lIGZpbHRlcihTTlAgJWluJSBzbnBfbGlzdC5zcGxpdCRgMWAkU05QKQoKc25wX2xpc3Quc3BsaXQgJT4lIG5hbWVzKCkgJT4lIHBhc3RlKGNvbGxhcHNlID0gIiwiKQoKdGVtcCA8LSBjKDEsMiwzLDQsNiwxMCwxMSwxMiwxNCwxNSwxNiwxOCwyMikKCgoKaW1wdXRhdGlvbi5pbmZvLkdSU1tbMV1dIDwtIGltcHV0YXRpb24uaW5mbyRgMWAgJT4lIGZpbHRlcihTTlAgJWluJSBzbnBfbGlzdC5zcGxpdCRgMWAkU05QKQoKCgp0ZW1wIDwtIGMoMSwyLDMsNCw2LDEwLDExLDEyLDE0LDE1LDE2LDE4LDIyKQppbXB1dGF0aW9uLmluZm8uR1JTIDwtIGxpc3QoKQpmb3IgKCBpIGluIGxlbmd0aCh0ZW1wKSkgewogIAogIGNoci5ub3cgPC0gdGVtcFtbaV1dCiAgCiAgaW1wdXRhdGlvbi5pbmZvLkdSU1tbaV1dIDwtIGltcHV0YXRpb24uaW5mb1tbY2hyLm5vd11dICU+JSBmaWx0ZXIoU05QICVpbiUgc25wX2xpc3Quc3BsaXRbW2Noci5ub3ddXSRTTlApCn0KCmltcHV0YXRpb24uaW5mby5HUlMgJT4lIHJiaW5kbGlzdCgpICU+JSBkaW0oKQoKaW1wdXRhdGlvbi5pbmZvLkdSUyAlPiUgbGFwcGx5KGFzLmRhdGEuZnJhbWUpICU+JSBsYXBwbHkoZGltKQpgYGAKCgpgYGB7cn0Kc2V0d2QoZGlyLkRhdGEpCmluZm8uR1JTc25wcyA8LSBmcmVhZCgiL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0RBVEFfTUFJTi9NRUdBL0ltcHV0YXRpb25fUmVmMTAwMEczdjUvT3V0L0ltcHV0YXRpb25fUmVzdWx0c19DTEVBTi9hdXRvc29tZXNOb0NocjIxLmluZm8uZ3oiLCBzZXAgPSAiXHQiKQoKaW5mby5HUlNzbnBzCmBgYAoKCgoKYGBge3J9CmluZm8gPC0gZnJlYWQoIi9Vc2Vycy9zaGF3amVzL0Ryb3Bib3gvRXNwaW5vc2FHcm91cC9EQVRBX01BSU4vTUVHQS9JbXB1dGF0aW9uX1JlZjEwMDBHM3Y1L091dC9JbXB1dGF0aW9uX1Jlc3VsdHNfQ0xFQU4vYXV0b3NvbWVzTm9DaHIyMS5pbmZvLmd6IikKCmluZm8KYGBgCgoKCgoKCgoKIyMjIyBNYWtlIGEgdGV4dCBmaWxlIGxpc3RpbmcgdGhlIHZhcmlhbnQgSURzIGZvciB0aGUgR1JTIFNOUHMgaW4gdGhlIG9yaWdpbmFsIEdSUyBhbmQgdGhlIHJldmlzZWQgR1JTCmBgYHtyfQp0b19ncmVwIDwtIGltcHV0ZWQudHJhdzAxICU+JSBzZWxlY3QoU05QKSAlPiUgdW5pcXVlKCkKCnNldHdkKGRpci5EYXRhKQpmd3JpdGUodG9fZ3JlcCwgIk1FR0FfMDQxODIyX0ltcHV0ZWRfVmFyaWFudElEc19PcmlnR1JTX1JldmlzZWRHUlNfdjAuMV9KUlMudHh0Iiwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFKQpgYGAKCiMjIyMgU2VhcmNoIHRoZSBpbmZvIGZpbGUgYW5kIGZpbHRlciBpdCB0byB0aGUgdmFyaWFudCBJRHMgcmVwcmVzZW50aW5nIFNOUHMgdGhhdCBhcmUgaW4gdGhlIG9yaWdpbmFsIG9yIHJldmlzZWQgR1JTCmBgYHtiYXNofQpjZCAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0FOQUxZU0lTL0NlbGlhY19NdWx0aU9taWNzL0dSUy9EU01JR19TaGFyZWQvTWFudXNjcmlwdF9GaWd1cmUxL0RhdGEnCnpjYXQgPCAnL1VzZXJzL3NoYXdqZXMvRHJvcGJveC9Fc3Bpbm9zYUdyb3VwL0RBVEFfTUFJTi9NRUdBL0ltcHV0YXRpb25fUmVmMTAwMEczdjUvT3V0L0ltcHV0YXRpb25fUmVzdWx0c19DTEVBTi9hdXRvc29tZXNOb0NocjIxLmluZm8uZ3onIHwgYXdrICdOUj09Rk5Se19bJDFdO25leHR9ISgkMSBpbiBfKScgJ01FR0FfMDQxODIyX0ltcHV0ZWRfVmFyaWFudElEc19PcmlnR1JTX1JldmlzZWRHUlNfdjAuMV9KUlMudHh0JyAtID4gJ01FR0FfMDQxODIyX1NOUHNfT3JpZ0dSU19SZXZpc2VkR1JTX3YwLjFfSlJTLmluZm8udHh0JwpgYGAKCgoKYGBge2Jhc2h9CmNkICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvQU5BTFlTSVMvQ2VsaWFjX011bHRpT21pY3MvR1JTL0RTTUlHX1NoYXJlZC9NYW51c2NyaXB0X0ZpZ3VyZTEvRGF0YScKemNhdCA8ICcvVXNlcnMvc2hhd2plcy9Ecm9wYm94L0VzcGlub3NhR3JvdXAvREFUQV9NQUlOL01FR0EvSW1wdXRhdGlvbl9SZWYxMDAwRzN2NS9PdXQvSW1wdXRhdGlvbl9SZXN1bHRzX0NMRUFOL2F1dG9zb21lc05vQ2hyMjEuaW5mby5neicgfCBncmVwIC1mICdNRUdBXzA0MTgyMl9JbXB1dGVkX1ZhcmlhbnRJRHNfT3JpZ0dSU19SZXZpc2VkR1JTX3YwLjFfSlJTLnR4dCcgPiAnTUVHQV8wNDE4MjJfU05Qc19PcmlnR1JTX1JldmlzZWRHUlNfdjAuMV9KUlMuaW5mbycKYGBgCgpgYGB7cn0Kc2V0d2QoZGlyLkRhdGEpCkdSU3NucHMuaW5mbyA8LSBmcmVhZCgiTUVHQV8wNDE4MjJfU05Qc19PcmlnR1JTX1JldmlzZWRHUlNfdjAuMV9KUlMuaW5mbyIpCgpHUlNzbnBzLmluZm8KYGBgCgoKYGBge3J9CnNldHdkKGRpci5JbXB1dGF0aW9uUmVzdWx0c1JBVykKaW1wdXRhdGlvbi5pbmZvIDwtIGxpc3QuZmlsZXMocGF0dGVybiA9ICJpbmZvIikgJT4lCiAgbGFwcGx5KGZyZWFkKSAlPiUKICByYmluZGxpc3QoKQoKaW1wdXRhdGlvbi5pbmZvCmBgYAoKCkNvZGUgcmVmZXJlbmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTM4MDkyNS9ncmVwLWEtbGFyZ2UtbGlzdC1hZ2FpbnN0LWEtbGFyZ2UtZmlsZQpncmVwIC1mIHRoZV9pZHMudHh0IGh1Z2UuY3N2CiAgIC1GLCAtLWZpeGVkLXN0cmluZ3MKICAgICAgICAgIEludGVycHJldCBQQVRURVJOIGFzIGEgIGxpc3QgIG9mICBmaXhlZCAgc3RyaW5ncywgIHNlcGFyYXRlZCAgYnkKICAgICAgICAgIG5ld2xpbmVzLCAgYW55ICBvZiAgd2hpY2ggaXMgdG8gYmUgbWF0Y2hlZC4gICgtRiBpcyBzcGVjaWZpZWQgYnkKICAgICAgICAgIFBPU0lYLikKYGBge3J9CiAgICAgICAgICAKICAgICAgICAgIAppbXB1dGVkLmRvc2FnZS5PcmlnR1JTLm5vbkhMQURRICU+JQogIHNlbGVjdCgtYyhJSUQsIERvc2FnZS5DT1VOVEVEKSkgJT4lCiAgdW5pcXVlKCkgJT4lCiAgc2VsZWN0KFNOUCkgJT4lCiAgbGVmdF9qb2luKGltcHV0YXRpb24uaW5mbywgYnkgPSAiU05QIikKCmltcHV0ZWQuZG9zYWdlLlJldmlzZWRHUlMgJT4lCiAgc2VsZWN0KC1jKElJRCwgRG9zYWdlLkNPVU5URUQpKSAlPiUKICB1bmlxdWUoKSAlPiUKICBzZWxlY3QoU05QKQoKaW1wdXRhdGlvbi5pbmZvCmBgYAoK